Dbplyr: in_schema для использования одного и того же соединения для двух разных баз данных

По причинам, которые я не буду здесь объяснять, мне нужно использовать один и тот же объект подключения для чтения двух баз данных в dbplyr. Я нашел несколько онлайн-ресурсов, но не понимаю. Пожалуйста, посмотрите на изображение ниже. Может ли кто-нибудь сказать мне, что я делаю не так? Большое спасибо!

library(tidyverse)
library(DBI) # main DB interface
library(dbplyr) # dplyr back-end for DBs
#> 
#> Attaching package: 'dbplyr'
#> The following objects are masked from 'package:dplyr':
#> 
#>     ident, sql
library(RSQLite)


##create the databases

df1 <- tibble(x=1:20,y=rep(c("a", "b"), 10))


df2 <- tibble(x=101:120,y=rep(c("d", "e"), 10))


con <- dbConnect(drv=RSQLite::SQLite(), dbname="db1.sqlite")

dbWriteTable(con,"mydata1",df1, overwrite=T)

dbDisconnect(con) # closes our DB connection



con <- dbConnect(drv=RSQLite::SQLite(), dbname="db2.sqlite")

dbWriteTable(con,"mydata2",df2, overwrite=T)

dbDisconnect(con) # closes our DB connection


## Now that I have created the two databases, I try reading them with the same connection object

con <- dbConnect(drv=RSQLite::SQLite())


db1 <- tbl(con, in_schema("db1.sqlite","mydata1"))
#> Error: no such table: db1.sqlite.mydata1
db2 <- tbl(con, in_schema("db2.sqlite","mydata2"))
#> Error: no such table: db2.sqlite.mydata2


### but this fails miserably. How to fix it?

Создано 24 декабря 2020 г. пакетом REPEX (v0.3.0)


person larry77    schedule 24.12.2020    source источник
comment
Если вы напишете собственную команду SQL (не через R или dbplyr), сможете ли вы получить доступ к обеим таблицам одновременно?   -  person Simon.S.A.    schedule 28.12.2020


Ответы (1)


В синтаксисе R нет ничего плохого. По сути, я использую тот же подход с несколькими базами данных в среде SQL Server.

Это проблема конфигурации базы данных. Две ваши базы данных не настроены таким образом, чтобы один запрос мог получить доступ к таблице в обеих базах данных.

Для SQLite похоже, что это можно сделать в собственном SQL (не через R) с помощью команды ATTACH (см. этот принятый ответ ). Вы также можете найти этот вопрос полезным. Оба эти вопроса связаны с написанием SQL напрямую, что я бы порекомендовал для вашей первоначальной попытки, поскольку он позволяет избежать дополнительного уровня участия R.

Если вы хотите сделать это только через R, это, вероятно, будет выглядеть примерно так:

con <- dbConnect(drv=RSQLite::SQLite(), dbname="db1.sqlite")

dbExecute(con, "attach 'db2.sqlite' as db2;")

# test query
test_query = paste("SELECT COUNT(*) AS num FROM db1.mydata1","\n"
                   "UNION ALL","\n"
                   "SELECT COUNT(*) AS num FROM db2.mydata2")
dbGetQuery(con, test_query)

Если последняя команда работает, значит, вы знаете, что запрос SQL может (сейчас) затронуть обе базы данных, поэтому вы можете попытаться использовать in_schema для подключения к обеим.

person Simon.S.A.    schedule 04.01.2021
comment
Спасибо за разъяснения. - person larry77; 26.01.2021