使用R包编写包装函数以连接到PostgreSQL数据库

时间:2018-12-24 20:39:42

标签: r postgresql

我是第一次写R包。它名为aactr,位于我的GitHub:https://github.com/jasonbaik94/aactr

目前,该程序包只有一个功能,aact_connect

aact_connect <- function(user, password) {

  drv <- DBI::dbDriver('PostgreSQL')
  con <- DBI::dbConnect(drv,
                   dbname="aact",
                   host="aact-db.ctti-clinicaltrials.org",
                   port=5432,
                   user=user,
                   password=password)

}

我担心的是,出于隐私原因,我的软件包用户不希望在R脚本中输入用户名和密码。

有什么好的方法可以确保用户隐私?

我有一个想法:当用户键入aact_connect()时,会弹出一个窗口,用户可以在其中输入usernamepassword并按Enter键,然后进行连接。另外,对于没有用户名或密码的用户,我将输入参数init_connection = TRUE,然后将加载此注册页面:https://aact.ctti-clinicaltrials.org/users/sign_up

我们非常欢迎其他任何建议!

1 个答案:

答案 0 :(得分:1)

有许多方法可以安全地处理脚本中的数据库凭据。请参见下面的几个示例:

  1. 使用配置文件(例如yaml)将R安全地保存在用户的计算机上,以使R读取所需的变量。参见@Spacedman's answer

    config.yaml

    db:
     host : localhost
     port : 5432
     name : mypgdb
     user : pg_useR
     pwd  : ***
    

    R

    library(yaml)
    config = yaml.load_file("/path/to/config.yml")
    
    dbConnect(drv, host = config$db$host, port = config$db$port,
              dbname = config$db$name, 
              user = config$db$user, password = config$db$pwd)
    
  2. 使用链接到用户或系统配置文件的环境变量:

    db_creds <- Sys.getenv(c("DB_HOST", "DB_PORT", "DB_NAME", "DB_USER", "DB_PWD"))
    
    con <- DBI::dbConnect(drv,
                          dbname = db_creds[['DB_NAME']],
                          host = db_creds[['DB_HOST']],
                          port = db_creds[['DB_PORT,']],
                          user = db_creds[['DB_USER']],
                          password = db_creds[['DB_PWD']])
    
  3. 使用DSN来维护连接参数,但需要ODBC连接,该连接可以与通用odbc程序包(与RPostgreSQL相同的DBI系列的一部分)运行。 Postgres为大多数操作系统维护最新的odbc drivers。参见R-bloggers post

    odbc.ini

    [myPG_DSN]
    Driver = PostgreSQL Unicode
    Database = mypg_db
    Servername = localhost
    UserName = pg_useR
    Password = ***
    

    R

    db <- dbConnect(odbc::odbc(), "myPG_DSN")