gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:20:03 25 4
gpt4 key购买 nike

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

`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. 发送查询,接受返回的“结果”对象
  2. 使用“结果”对象获取结果
  3. 清除“结果”对象

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

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

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

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

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

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

在使用 SQL 参数化时发送数据返回查询时,您不应该使用 dbGetQuery(以缓解 sql injection )。相反,您将返回使用 dbSendQuerydbBind(用于参数)、dbFetchdbClearResult

关于r - 在 R 中的函数内断开 DBI/RSQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51213886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com