跳至内容

管理数据库、连接和语句的生命周期可能很复杂且容易出错。 如果您依赖垃圾回收(即,不执行任何操作并让对象超出范围),包装底层 ADBC 指针的 R 对象将以正确的顺序执行清理; 但是,显式清理这些对象是一个好的做法。 这些助手旨在使显式和可预测的清理易于实现。

用法

with_adbc(x, code)

local_adbc(x, .local_envir = parent.frame())

参数

x

一个 ADBC 数据库、ADBC 连接、ADBC 语句,或者从 ADBC 函数调用返回的 nanoarrow_array_stream。

code

在清理输入之前要执行的代码。

.local_envir

其作用域应与输入相关联的执行环境。

  • with_adbc() 返回 code 的结果

  • local_adbc() 返回输入,不可见。

详情

请注意,您可以使用 adbc_connection_join()adbc_statement_join() 将父对象的生命周期与子对象的生命周期绑定。 这些函数会将对父对象的任何先前引用标记为已释放,因此您仍然可以使用 local 和 with 助手来管理父对象,然后再将其加入。 在 adbc_statement_execute_query() 中使用 stream_join_parent = TRUE 将语句的生命周期与输出流绑定。

示例

# Using with_adbc():
with_adbc(db <- adbc_database_init(adbc_driver_void()), {
  with_adbc(con <- adbc_connection_init(db), {
    with_adbc(stmt <- adbc_statement_init(con), {
      # adbc_statement_set_sql_query(stmt, "SELECT * FROM foofy")
      # adbc_statement_execute_query(stmt)
      "some result"
    })
  })
})
#> [1] "some result"

# Using local_adbc_*() (works best within a function, test, or local())
local({
  db <- local_adbc(adbc_database_init(adbc_driver_void()))
  con <- local_adbc(adbc_connection_init(db))
  stmt <- local_adbc(adbc_statement_init(con))
  # adbc_statement_set_sql_query(stmt, "SELECT * FROM foofy")
  # adbc_statement_execute_query(stmt)
  "some result"
})
#> [1] "some result"