问题描述
亲爱的,
我快到了,但我不能多走一英里。 我需要做一些简单的事情:bind_row 来自两个数据库的两个表。请看一下这个简单的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))
con1 <- dbConnect(drv=Rsqlite::sqlite(),dbname="db1.sqlite")
dbWriteTable(con1,"mydata",df1,overwrite=T)
dbdisconnect(con1) # closes our DB connection
con2 <- dbConnect(drv=Rsqlite::sqlite(),dbname="db2.sqlite")
dbWriteTable(con2,df2,overwrite=T)
dbdisconnect(con2) # closes our DB connection
#### Now read the databases and use union_all to bind the rows of their table
con <- dbConnect(drv=Rsqlite::sqlite(),dbname="db1.sqlite")
db1 <- tbl(con,"mydata")
db1
#> # Source: table<mydata> [?? x 2]
#> # Database: sqlite 3.33.0 [/tmp/RtmpIk3vcV/reprex23781b78632e/db1.sqlite]
#> x y
#> <int> <chr>
#> 1 1 a
#> 2 2 b
#> 3 3 a
#> 4 4 b
#> 5 5 a
#> 6 6 b
#> 7 7 a
#> 8 8 b
#> 9 9 a
#> 10 10 b
#> # … with more rows
con <- dbConnect(drv=Rsqlite::sqlite(),dbname="db2.sqlite")
db2 <- tbl(con,"mydata")
db2
#> # Source: table<mydata> [?? x 2]
#> # Database: sqlite 3.33.0 [/tmp/RtmpIk3vcV/reprex23781b78632e/db2.sqlite]
#> x y
#> <int> <chr>
#> 1 101 d
#> 2 102 e
#> 3 103 d
#> 4 104 e
#> 5 105 d
#> 6 106 e
#> 7 107 d
#> 8 108 e
#> 9 109 d
#> 10 110 e
#> # … with more rows
db12 <- union_all(db1,db2)
#> Error: `x` and `y` must share the same src,set `copy` = TRUE (may be slow).
由 reprex package (v0.3.0) 于 2020 年 12 月 22 日创建
失败是因为(至少我认为)我应该为 db1 和 db2 使用相同的连接对象,请参阅
https://github.com/r-dbi/bigrquery/issues/219
但我无法正确完成。解决方案必须是单行的,任何帮助表示赞赏! 谢谢!
解决方法
尝试两种可能性;
1 在 copy = TRUE
命令中设置 union_all
:
db12 <- union_all(db1,db2,copy = TRUE)
根据警告,这可能会很慢,因为它需要在两个数据库之间复制数据。
2 使用 in_schema
为两者使用相同的连接:
con <- dbConnect(drv=RSQLite::SQLite(),dbname="db1.sqlite")
db1 <- tbl(con,in_schema("db1.sqlite","mydata"))
db2 <- tbl(con,in_schema("db2.sqlite","mydata"))
db12 <- union_all(db1,db2)
根据您的数据库设置,这可能并不总是有效。