首页 > 解决方案 > 检查 R-DBI 连接对象的类

问题描述

我正在重写一个可选择接受连接对象的函数。应验证该参数是否是有效的连接/通道。我如何使用DBI包稳健地做到这一点?(具体来说,我正在使用odbc包。)

我想要可以容纳所有DBI连接对象的东西,但我会满足于 odbc 连接对象

运行这样的东西不会产生我知道如何查询的值inherits()

library(DBI)
con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
class(con)
# [1] "SQLiteConnection"
# attr(,"package")
# [1] "RSQLite"
DBI::dbDisconnect(con)

相比之下,RODBC返回的类比我能抓住的更好(和​​)。RODBCPool

如果有帮助,这里有更多来自这个特定 DBI 连接的内部信息。

> str(con)
Formal class 'SQLiteConnection' [package "RSQLite"] with 7 slots
  ..@ ptr                :<externalptr> 
  ..@ dbname             : chr ":memory:"
  ..@ loadable.extensions: logi TRUE
  ..@ flags              : int 70
  ..@ vfs                : chr ""
  ..@ ref                :<environment: 0x0000000000000000> 
  ..@ bigint             : chr "integer64"

标签: rodbcr-dbi

解决方案


DBI 规范要求¹所有连接都继承自DBIConnection. “新风格”的后端都是这样实现的,IIRC:

library(RSQLite)
con <- dbConnect(SQLite())
inherits(con, "DBIConnection")
#> [1] TRUE

reprex 包(v0.2.0) 于 2018 年 5 月 18 日创建。


¹ 从头开始​​“需要”:最终将明确要求,https://github.com/r-dbi/DBItest/issues/170


推荐阅读