我正在努力简化一些数据库连接。使用该odbc包,我已成功与我的一个数据库建立了连接,如下所示:
library(odbc)
con <- dbConnect(odbc::odbc(), "db_name",
UID = "username",
PWD = "password")
Run Code Online (Sandbox Code Playgroud)
这有效,并且数据库架构按预期显示在连接窗格中(使用RStudio Server 1.1.383)
但是,我需要在用户定义的函数中调用此连接来解密我们的用户凭据。一个最小的例子:
db_Connect_mod <- function(userid,
password,
...){
# Needed Processes, but ommitted for simplicity of this question
# ...
con <- dbConnect(odbc::odbc(), "db_name",
UID = userid,
PWD = password)
return(con)
}
Run Code Online (Sandbox Code Playgroud)
然后我运行:
con <- db_Connect_mod(userid, password, ...)
Run Code Online (Sandbox Code Playgroud)
实际的数据库连接con成功,但它不再出现在 RStudio 连接窗格中。
我知道它odbc使用Connections Contract,但它似乎并没有延续到我的新函数中。有没有办法强制连接契约转移到顶层函数?
我研究过 using odbc:::on_connection_opened(con, code = "..."),它似乎有效,但不如从odbc我的新函数中继承连接契约那么功能,并且宁愿不依赖于非导出函数。
我相信此行为是由于odbc github 问题的更改所致
似乎没有多大兴趣,但发布了我一直在使用的解决方法:
我用来match.call()收集参数,然后将其解析到odbc:::on_connection_opened()函数中,如前所述。可能不是最佳实践,但是嘿它有效。
我添加了逻辑参数connection_pane来轻松关闭或打开此功能:
internal_package::db_Connect_mod <- function(userid,
password,
connection_pane,
...){
# Needed Processes, but ommitted for simplicity of this question
# ...
con <- dbConnect(odbc::odbc(), "db_name",
UID = userid,
PWD = password)
if(connection_pane){
code <- c(match.call()) # This saves what was typed into R
odbc:::on_connection_opened(
con,
paste(c("library(internal_package)",
paste("con <-", gsub(", ", ",\n\t", code))),
collapse = "\n"))
}
return(con)
}
Run Code Online (Sandbox Code Playgroud)
glue想象一下,如果有stringr进一步的改进,这看起来会更漂亮
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |