清理方式来整理和处理RMySQL连接?

时间:2015-01-07 04:35:59

标签: r rmysql

我对R来说相当新,所以如果这是一个业余问题,请原谅我。我仍然没有了解R语言如何运作的部分内容,我还没有使用足够的封闭来真正建立如何处理这个问题的直觉。

我想以一种干净的方式在我的R项目中打开和关闭数据库连接。我预留了各种脚本,所有脚本都使用通用的数据库连接配置文件(我不把它放在我的仓库中,它只是本地文件),所有这些都需要连接到同一个MySQL数据库中。

最终目标是做类似的事情:

query <- db_open()
out <- query("select * from example limit 10")
db_close()

这是我到目前为止所写的内容(我的所有脚本都从另一个.R文件加载这些函数):

db_open <- function() {
  db_close()  
  db_conn <<- dbConnect(MySQL(), user = db_user, password = db_pass, host = db_host)

  query <- function(...) { dbGetQuery(db_conn, ...) }

  return(query)
}

db_close <- function() {
  result <- tryCatch({
    dbDisconnect(db_conn)
  }, warning = function(w) {
    # ignore
  }, error = function(e) {
    return(FALSE)
  })

  return(result)
}

当我不应该以OOP的方式思考这个问题时,我认为将db_conn放在全球环境中是不必要的甚至是错误的。

这是完成我想要的合理方式吗?我有没有更好的方法在这里失踪?

感谢任何建议。

1 个答案:

答案 0 :(得分:2)

你基本上拥有它,你只需要将查询功能移动到它自己的功能中。关于保持db_conn,没有理由不在全球环境中使用它。

db_open <- function() {
  db_close()  
  db_conn <<- dbConnect(MySQL(), user='root', password='Use14Characters!', dbname='msdb_complex', host='localhost')
}

db_close <- function() {
    result <- tryCatch({
    dbDisconnect(db_conn)
  }, warning = function(w) {
    # ignore
  }, error = function(e) {
    return(FALSE)
  })

  return(return)
}

query <- function(x,num=-1)
{
  q <- dbSendQuery(db_conn, x)
  s <- fetch(q, num);
}

然后你应该可以做类似的事情:

query <- db_open()
results <- query("SELECT * FROM msenrollmentlog", 10)
db_close()