在不创建显式 DBI 对象的情况下将 dplyr 与数据库一起使用

Use dplyr with database without creating an explicit DBI object

大多数展示如何将 dplyr 与数据库结合使用的代码示例都涉及创建数据库连接对象:

connStr <- "driver=driver;server=hostname;database=mydatabase;..."
db <- DBI::dbConnect(odbc::odbc(), .connection_string=connStr)

tbl <- tbl(db, "mytable")
tbl %>% verb1 %>% verb2 %>% ...

但是,假设我省略了创建 db 对象:

tbl <- tbl(DBI::dbConnect(odbc::odbc(), .connection_string=connStr), "mytable")
tbl %>% verb1 %>% verb2 %>% ...

这样做有什么后果吗?我会用完数据库 resources/leak memory/etc 吗?

我心目中的DBMS是SQLServer,驱动包是odbc,以防万一

新的 DBI specs 假设调用者释放了他们分配给 dbConnect() 的所有连接,并相应地调用了 dbDisconnect()。如果不这样做,只会在垃圾回收期间(或R会话结束时)关闭连接,从而延迟资源的释放,甚至泄漏连接。

确切的行为取决于所涉及的 DBI 后端(在本例中为 odbc 包)。根据 odbc 的维护者 Jim Hester 的说法,

[it] automatically calls dbDisconnect() when the connection object is garbage collected, so this won't leak connections. If you are opening a large number of connections it is always best to be explicit, if you are just doing this interactively it is probably ok to rely on the garbage collector in this case.