【问题标题】:Include Database Connection in my R package在我的 R 包中包含数据库连接
【发布时间】:2020-08-14 22:52:09
【问题描述】:

每天,我都从 R 中连接到公司数据库。目前,我有一个 R 脚本,用于建立连接并进行所有分析前的数据准备(变异和连接)。我想将其包含在 R 包 DWH 中,以便与同事分享此过程。

这里是一些示例代码:

creds <- read.csv2('C:/creds.csv')

con <- ROracle::dbConnect(drv = DBI::dbDriver("Oracle"),
                               username = creds$user, password= creds$pwd,
                               dbname = 'DWH',
                               prefetch = FALSE, bulk_read = 1000L, stmt_cache = 0L,
                               external_credentials = FALSE, sysdba = FALSE)

PREST <- dplyr::tbl(con, dbplyr::in_schema('ADWH', 'PREST')) %>%
    transmute(date = A_DWH_DATE_TODAY,
              amount = A_DWH_POL_IND_COLL_AMOUNT)

理想情况下,我想用library(DWH) 加载包,然后PREST 对象应该可供所有人使用以供进一步使用,例如

library(DWH)
PREST %>% filter(date > 201912) 

这在采购 R 脚本时效果很好。如何在 R 包中实现这一点? 我正在使用 ROracle,但这应该是与任何其他 odbc 数据库连接相同的过程。

【问题讨论】:

  • 这个问题提出了一个更广泛的请求,即如何构建具有依赖关系的包。阅读有关使用依赖库开发 R 包的文档、教程、帖子等。
  • 另外,使用 ROracle 不使用 ODBC。您可以使用odbc 连接到 Oracle,但需要 Oracle ODBC 驱动程序。要集成该解决方案,用户需要提供动态连接以及可用的附加驱动程序安装。
  • 在包中包含连接身份验证(用户/通行证)通常是不受欢迎的,无论是出于安全性还是包的可维护性。您应该能够使用 config 包或 envvars 来传递用户/密码,最好由用户提供/控制器。
  • 至于在你的包中包含PREST,你可能需要把它变成一个动态拉取数据的函数,所以你的用户需要使用类似的东西PREST() %&gt;% transmute(...)。您需要在包中进行连接管理,如 (1) library(DWH) not 启动连接; (2) 函数要么需要打开、查询和关闭,要么所有这些函数都引用一个存储连接的内部变量,测试它是否仍然打开(超时?),如果需要重新连接,等等。
  • 除了DBI 包之外,您可能更喜欢使用pool,因为它会自动重新连接相当可靠(根据我的经验)。

标签: r odbc dbi dbplyr roracle


【解决方案1】:

虽然我同意@r2evans 的观点,即这不是一个好的设计决策,但如果您致力于这样做,您可以采用的方法是将变量分配给全局环境的函数(根据this 问题) .

这看起来像:

create_globals = function(){
    creds <- read.csv2('C:/creds.csv')

    con <- ROracle::dbConnect(drv = DBI::dbDriver("Oracle"),
                                   username = creds$user, password= creds$pwd,
                                   dbname = 'DWH',
                                   prefetch = FALSE, bulk_read = 1000L, stmt_cache = 0L,
                                   external_credentials = FALSE, sysdba = FALSE)

    PREST <- dplyr::tbl(con, dbplyr::in_schema('ADWH', 'PREST')) %>%
        transmute(date = A_DWH_DATE_TODAY,
                  amount = A_DWH_POL_IND_COLL_AMOUNT)

    assign("creds", cred, envir = .GlobalEnv)
    assign("con", con, envir = .GlobalEnv)
    assign("PREST", PREST, envir = .GlobalEnv)
}

那么你的包使用看起来像:

library(DWH)
create_globals()
PREST %>% filter(date > 201912) 

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多