在函数内调用“odbc”连接不会显示在 RStudio 连接窗格中

Dav*_*ald 6 odbc r rstudio

我正在努力简化一些数据库连接。使用该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 问题的更改所致

Dav*_*ald 7

似乎没有多大兴趣,但发布了我一直在使用的解决方法:

我用来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进一步的改进,这看起来会更漂亮