如何解决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
连接到两个数据库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。