使用dplyr与数据库,而无需创建一个明确的DBI对象展示如何使用数据库使用dplyr

使用dplyr与数据库,而无需创建一个明确的DBI对象展示如何使用数据库使用dplyr

问题描述:

大多数代码示例涉及创建一个数据库连接对象:使用dplyr与数据库,而无需创建一个明确的DBI对象展示如何使用数据库使用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 %>% ... 

对此有什么影响?我会使用数据库资源/泄漏内存/等?

DBMS我想到的是SQL Server,驱动程序包是odbc,万一它很重要。

+0

想到的唯一情况是,将此连接打开变得非常容易。这对你来说可能是或可能不是一个严重的问题。 – Benjamin

新的DBI specs假定主叫方通过相应的dbDisconnect()呼叫将其分配的所有连接释放为dbConnect()。如果不这样做,则只会在垃圾收集期间(或R会话结束时)关闭连接,从而延迟解放资源,甚至泄漏连接。

确切的行为取决于涉及的DBI后端(在本例中为odbc软件包)。据吉姆赫斯特,ODBC的维护者,

[它]自动调用dbDisconnect()当连接对象进行垃圾回收,所以这不会泄漏的连接。如果你打开了大量的连接,那么总是最好是明确的,如果你只是交互式地做这件事情,在这种情况下依靠垃圾收集器可能是确定的。