我正在努力简化一些数据库连接。使用odbc
包,我已经成功建立了与我的一个数据库的连接,如下所示:
library(odbc)
con <- dbConnect(odbc::odbc(), "db_name",
UID = "username",
PWD = "password")
这样可行,数据库架构按预期显示在连接窗格中(使用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)
}
然后我跑:
con <- db_Connect_mod(userid, password, ...)
实际的数据库连接con
成功,但它不再出现在RStudio连接窗格中。
我知道odbc
使用了Connections Contract,但它似乎并没有延续到我的新功能。有没有办法强制连接合同转移到顶级功能?
我已经看过使用odbc:::on_connection_opened(con, code = "...")
,这似乎有用,但不如在我的新功能中从odbc
继承Connections Contract那样功能,而不是依赖于非导出功能
我认为此行为是由this odbc github issue
的变化引起的答案 0 :(得分:0)
似乎没什么兴趣,但是发布我一直在使用的解决方法:
我正在使用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)
}
想象一下,使用glue
或stringr
可以看起来更漂亮