我对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放在全球环境中是不必要的甚至是错误的。
这是完成我想要的合理方式吗?我有没有更好的方法在这里失踪?
感谢任何建议。
答案 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()