Как вы запрашиваете разные базы данных, расположенные на одном хосте, с одним подключением к пулу и dplyr в R? - PullRequest
0 голосов
/ 24 мая 2018

До сих пор я создавал отдельный пул для каждой базы данных 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)

Хотя для этого не нужно иметь точную форму.

Заранее спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

На странице DBI соединение DBI связано с определенной базой данных:

DBIConnection: представляет соединение с конкретной базой данных

Пакет pool, следовательно, является абстракцией объекта Соединения DBI, который должен быть оптимизирован для таких пакетов, как Shiny или Plumber, где требуется пул Соединений DBI с той же базой данных обслуживать несколько одновременных пользователей.

В результате вы обрабатываете 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-приложения и API-интерфейсы Plumber).Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...