Dbplyr: in_schema 为两个不同的数据库使用相同的连接

问题描述

这里不解释原因,我需要使用同一个连接对象来读取dbplyr中的两个数据库。我找到了一些在线资源,但我没有做对。 请看看下面的reprex。 谁能告诉我我做错了什么? 非常感谢!

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?

reprex package (v0.3.0) 于 2020 年 12 月 24 日创建

解决方法

您的 R 语法没有任何问题。我对 SQL Server 环境中的多个数据库使用基本相同的方法。

这是一个数据库配置问题。您的两个数据库未设置为单个查询可以访问两个数据库中的表。

对于 SQLite,它看起来可以使用 ATTACH 命令在本机 SQL(而不是通过 R)中完成(请参阅 this 接受的答案)。您可能还会发现 this 问题很有帮助。这两个问题都涉及直接编写 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 连接到两个数据库。