0

由于这里不解释的原因,我需要使用同一个连接对象来读取 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 包于 2020-12-24 创建(v0.3.0)

4

1 回答 1

0

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

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

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

于 2021-01-04T23:07:22.947 回答