R:最佳实践 - dplyr 和 odbc multi table 操作(取自 SQL)
R: Best Practices - dplyr and odbc multi table actions (retrieved from SQL)
假设您的 tables 存储在 SQL 服务器数据库中,并且您想要执行多个 table 操作,即从中加入多个 tables相同的数据库。
以下代码可以交互并从 SQL 服务器接收数据:
library(dplyr)
library(odbc)
con <- dbConnect(odbc::odbc(),
.connection_string = "Driver={SQL Server};Server=.;Database=My_DB;")
Table1 <- tbl(con, "Table1")
Table1 # View glimpse of Table1
Table2 <- tbl(con, "Table2")
Table2 # View glimpse of Table2
Table3 <- tbl(con, "Table3")
但是,使用 相同的 连接检索了一些结果,最终出现以下错误:
Error: [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt
我目前的谷歌搜索技能让我得到了后端不支持多个活动结果集 (MARS) 的答案 - 我想超过 2 个活动结果集是最大值吗? (后端是 DBI 和 odbc)
所以,我的问题是:如果我想从 SQL 数据库的多个 table 中收集数据,最佳做法是什么?
为每个table打开一个连接?
主动关闭连接,下次再打开table?
后台是否支持MARS解析为连接串?
为了建立一个可以容纳多个结果集的连接,我很幸运地使用了以下连接代码:
con <- DBI::dbConnect(odbc::odbc(),
Driver = "SQL Server Native Client 11.0",
Server = "my_host",
UID = rstudioapi::askForPassword("Database UID"),
PWD = rstudioapi::askForPassword("Database PWD"),
Port = 1433,
MultipleActiveResultSets = "True",
Database = my_db)
最重要的是,我发现新的 pool
-package 可以完成这项工作:
pool <- dbPool(odbc::odbc(),
Driver = "SQL Server Native Client 11.0",
Server = "my_host",
UID = rstudioapi::askForPassword("Database UID"),
PWD = rstudioapi::askForPassword("Database PWD"),
Port = 1433,
MultipleActiveResultSets = "True",
Database = my_db)
它比 DBI 连接更快更稳定,但是,一个小缺点是数据库不会在连接选项卡中弹出以便于参考。
对于这两种方法,记得在完成后关闭 connection/pool。对于 DBI 方法,其:
dbDisconnect(con)
而池方法通过调用关闭:
poolClose(pool)
假设您的 tables 存储在 SQL 服务器数据库中,并且您想要执行多个 table 操作,即从中加入多个 tables相同的数据库。
以下代码可以交互并从 SQL 服务器接收数据:
library(dplyr)
library(odbc)
con <- dbConnect(odbc::odbc(),
.connection_string = "Driver={SQL Server};Server=.;Database=My_DB;")
Table1 <- tbl(con, "Table1")
Table1 # View glimpse of Table1
Table2 <- tbl(con, "Table2")
Table2 # View glimpse of Table2
Table3 <- tbl(con, "Table3")
但是,使用 相同的 连接检索了一些结果,最终出现以下错误:
Error: [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt
我目前的谷歌搜索技能让我得到了后端不支持多个活动结果集 (MARS) 的答案 - 我想超过 2 个活动结果集是最大值吗? (后端是 DBI 和 odbc)
所以,我的问题是:如果我想从 SQL 数据库的多个 table 中收集数据,最佳做法是什么?
为每个table打开一个连接?
主动关闭连接,下次再打开table?
后台是否支持MARS解析为连接串?
为了建立一个可以容纳多个结果集的连接,我很幸运地使用了以下连接代码:
con <- DBI::dbConnect(odbc::odbc(),
Driver = "SQL Server Native Client 11.0",
Server = "my_host",
UID = rstudioapi::askForPassword("Database UID"),
PWD = rstudioapi::askForPassword("Database PWD"),
Port = 1433,
MultipleActiveResultSets = "True",
Database = my_db)
最重要的是,我发现新的 pool
-package 可以完成这项工作:
pool <- dbPool(odbc::odbc(),
Driver = "SQL Server Native Client 11.0",
Server = "my_host",
UID = rstudioapi::askForPassword("Database UID"),
PWD = rstudioapi::askForPassword("Database PWD"),
Port = 1433,
MultipleActiveResultSets = "True",
Database = my_db)
它比 DBI 连接更快更稳定,但是,一个小缺点是数据库不会在连接选项卡中弹出以便于参考。
对于这两种方法,记得在完成后关闭 connection/pool。对于 DBI 方法,其:
dbDisconnect(con)
而池方法通过调用关闭:
poolClose(pool)