在 R 中的函数内断开 DBI / RSQLite

Disconnect DBI / RSQLite within a function in R

我正在构建一个供内部使用的包,并试图从用户那里抽象出所有可能的数据库交互。我需要连接到数据库并在函数内断开与数据库的连接(我认为)。但是,断开连接不起作用。

`my_func = function(){
    con = DBI::dbConnect(RSQLite::SQLite(), 'db_location.sqlite')
    r = DBI::dbSendQuery("SELECT * ...")
    dat = DBI::dbFetch(r)
    DBI::dbDisconnect(con)
    return(dat)
}`

如果调用函数: MY_LIBRARY::my_func()

数据已返回,但连接未终止并显示警告。

`Warning message:
In connection_release(conn@ptr) :
    There are 1 result in use. The connection will be released when 
    they are closed`

SQL 查询通常是一个三步过程(忽略连接管理):

  1. 发送查询,接受 returned "result" 对象
  2. 使用 "result" 对象获取结果
  3. 清除 "result" 对象

第三步很重要,因为未清除它表示为该查询保留的资源。某些数据库连接不允许多个同时未清除的结果,一次只能查询一个。

这在历史上是通过以下方式完成的:

res <- dbSendQuery(con, "SELECT ...")
dat <- dbFetch(res)
dbClearResult(res)

不久前(不知道版本),DBI 提供了一个强大的便利函数,可以将所有三行代码更改为一行代码:

dat <- dbGetQuery(con, "SELECT ...")

当查询不是 returning 数据(例如 UPDATEINSERT 时,此函数不适用,在这种情况下,您应该使用 dbSendStatement (可选地后跟 dbGetRowsAffected) 或 dbExecute(自动调用 dbGetRowsAffected)。

您应该在发送数据时使用dbGetQuery-return在您使用SQL参数化查询时使用sql injection).相反,您会 return 使用 dbSendQuerydbBind(对于参数)、dbFetchdbClearResult.