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

时间:2018-02-22 20:45:24

标签: r odbc rstudio

我正在努力简化一些数据库连接。使用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

的变化引起的

1 个答案:

答案 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)
}

想象一下,使用gluestringr可以看起来更漂亮