在RStudio连接面板中调用`odbc`连接函数未显示。

6

我正在努力简化一些数据库连接。使用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使用连接契约,但似乎没有传递到我的新函数。有没有办法强制将连接契约传递到顶级函数?
我已经尝试使用odbc:::on_connection_opened(con, code = "..."),似乎可以工作,但不如从odbc继承连接契约那样功能强大,并且不想依赖于非导出函数。
我认为这种行为是由于来自此odbc github问题的更改造成的。
1个回答

6

似乎没有太多的兴趣,但我会分享我一直在使用的解决方法:

我使用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 可以使这个看起来更漂亮。


我认为这个问题也与此处的问题/答案有关 https://github.com/r-dbi/odbc/issues/158,而且这也应该解决这个问题 https://community.rstudio.com/t/db-connection-through-dbi-is-too-slow-for-large-db/5550/5。 - hannes101
不错!我之前试着用 rstudioapi::sendToConsole() 做同样的事情,但这个方法更简洁。 - der_grund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接