到目前为止,我一直在为服务器上的每个MySQL数据库创建一个单独的池,并使用dplyr来查询它们:
p1 <- pool::dbPool(
drv = RMySQL::MySQL(),
host = myhost,
port = myport,
username = myusername,
password = mypassword,
dbname = mydbname1)
t1 <- dplyr::tbl(p1, "mytable1") %>%
dplyr::collect(n = Inf)
p2 <- pool::dbPool(
drv = RMySQL::MySQL(),
host = myhost,
port = myport,
username = myusername,
password = mypassword,
dbname = mydbname2)
t2 <- dplyr::tbl(p2, "mytable2") %>%
dplyr::collect(n = Inf)
有许多数据库,因此该方法会导致很多连接。我宁愿只使用一个池而只是更改数据库,但我不知道如何实现。我想它看起来像这样:
p <- pool::dbPool(
drv = RMySQL::MySQL(),
host = myhost,
port = myport,
username = myusername,
password = mypassword)
t1 <- dplyr::tbl(select_db(p, mydbname1), "mytable1") %>%
dplyr::collect(n = Inf)
t2 <- dplyr::tbl(select_db(p, mydbname2), "mytable2") %>%
dplyr::collect(n = Inf)
但是,它不需要具有那种确切的形式。
提前致谢!
答案 0 :(得分:0)
从DBI页面,DBI连接与特定数据库绑定:
DBIConnection:表示与特定数据库的连接
然后,pool
包是DBI Connection对象的抽象,该对象要针对像Shiny或Plumber这样的包进行优化,其中需要一个DBI Connections 池到同一个数据库为多个同时用户服务。
因此,您将pool
对象视为,它是一个Connection对象。
对我而言,这意味着您所建议的内容目前无法实现,并且不在pool
范围内。
为了使这种类型的东西不那么繁琐,可以创建一个辅助函数,使更容易创建与数据库的连接(当所有参数都相同时):
helper <- function(dbname){
pool::dbPool(
drv = RMySQL::MySQL(),
host = myhost,
port = myport,
username = myusername,
password = mypassword,
dbname = dbname)
}
pool1 <- helper(mydbname1);
pool2 <- helper(mydbname2);
但是,我对pool
的理解意味着2个不同的数据库意味着需要2个不同的连接或pool
个对象。换句话说:pool
并不意味着跨数据库汇集连接。它意味着pool
与同一数据库的连接(同样,支持Shiny apps和Plumber API等应用程序)。希望有所帮助!