在 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 查询通常是一个三步过程(忽略连接管理):
- 发送查询,接受 returned "result" 对象
- 使用 "result" 对象获取结果
- 清除 "result" 对象
第三步很重要,因为未清除它表示为该查询保留的资源。某些数据库连接不允许多个同时未清除的结果,一次只能查询一个。
这在历史上是通过以下方式完成的:
res <- dbSendQuery(con, "SELECT ...")
dat <- dbFetch(res)
dbClearResult(res)
不久前(不知道版本),DBI
提供了一个强大的便利函数,可以将所有三行代码更改为一行代码:
dat <- dbGetQuery(con, "SELECT ...")
当查询不是 returning 数据(例如 UPDATE
或 INSERT
时,此函数不适用,在这种情况下,您应该使用 dbSendStatement
(可选地后跟 dbGetRowsAffected
) 或 dbExecute
(自动调用 dbGetRowsAffected
)。
您应该不在发送数据时使用dbGetQuery
-return在您使用SQL参数化查询时使用sql injection).相反,您会 return 使用 dbSendQuery
、dbBind
(对于参数)、dbFetch
和 dbClearResult
.
我正在构建一个供内部使用的包,并试图从用户那里抽象出所有可能的数据库交互。我需要连接到数据库并在函数内断开与数据库的连接(我认为)。但是,断开连接不起作用。
`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 查询通常是一个三步过程(忽略连接管理):
- 发送查询,接受 returned "result" 对象
- 使用 "result" 对象获取结果
- 清除 "result" 对象
第三步很重要,因为未清除它表示为该查询保留的资源。某些数据库连接不允许多个同时未清除的结果,一次只能查询一个。
这在历史上是通过以下方式完成的:
res <- dbSendQuery(con, "SELECT ...")
dat <- dbFetch(res)
dbClearResult(res)
不久前(不知道版本),DBI
提供了一个强大的便利函数,可以将所有三行代码更改为一行代码:
dat <- dbGetQuery(con, "SELECT ...")
当查询不是 returning 数据(例如 UPDATE
或 INSERT
时,此函数不适用,在这种情况下,您应该使用 dbSendStatement
(可选地后跟 dbGetRowsAffected
) 或 dbExecute
(自动调用 dbGetRowsAffected
)。
您应该不在发送数据时使用dbGetQuery
-return在您使用SQL参数化查询时使用sql injection).相反,您会 return 使用 dbSendQuery
、dbBind
(对于参数)、dbFetch
和 dbClearResult
.