r-Dbplyr:组合两个表并将添加到数据库的结果中,而不将它们加载到内存中



请看一下文章末尾的简单脚本。我有一个包含两个表的数据库,我使用union_all将它们组合在一起。有没有一种方法可以在不收集数据的情况下将结果添加到数据库中,即将数据加载到内存中?非常感谢!



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="db.sqlite")
dbWriteTable(con,"mydata1",df1, overwrite=T)
dbWriteTable(con,"mydata2",df2, overwrite=T)
dbDisconnect(con) # closes our DB connection

con <- dbConnect(drv=RSQLite::SQLite(), dbname="db.sqlite")
mydb1 <- tbl(con, "mydata1")
mydb2 <- tbl(con, "mydata2")

mydb12 <- union_all(mydb1,mydb2)
#is there a way to add the union of mydb1 and mydb2 to the database without explicitly collecting the data?

由reprex包(v0.3.0(于2020-12-24创建

既然要处理SQL,就只使用SQL。

collect(mydb1) %>%
nrow()
# [1] 20
DBI::dbExecute(con, "insert into mydata1 select * from mydata2")
# [1] 20
collect(mydb1) %>%
nrow()
# [1] 40
collect(mydb1) %>%
tail()
# # A tibble: 6 x 2
#       x y    
#   <int> <chr>
# 1   115 d    
# 2   116 e    
# 3   117 d    
# 4   118 e    
# 5   119 d    
# 6   120 e    

如果您希望将合并后的数据放在一个新表中,那么这里有一个替代方案。

DBI::dbExecute(con, "
create table mydata12 as
select * from mydata2 union all select * from mydata1")

最新更新