使用管道将表写入多个数据库连接

时间:2017-12-14 20:02:29

标签: r dplyr magrittr rsqlite r-dbi

我创建了两个sqlite数据库,我想使用magrittr / dplyr管道约定为每个数据库写一个数据帧。

conn1 <- DBI::dbConnect(drv = RSQLite::SQLite(), dbname = "db1")
conn2 <- DBI::dbConnect(drv = RSQLite::SQLite(), dbname = "db2")

iris %>%
 DBI::dbWriteTable(conn1, "iris", .) %>%  # works
 DBI::dbWriteTable(conn2, "iris", .)      # does not work because lhs is not a table

另一次(失败)尝试,因为dbWriteTable只接受单个连接

iris %>%
 DBI::dbWriteTable(c(conn1, conn2), "iris", .)

我更喜欢使用管道变体的解决方案,也许是保留iris输出的变体

2 个答案:

答案 0 :(得分:3)

除了MrFlicks评论之外,您可以使用purrrapply系列函数使用walk对连接列表进行迭代,使用通常调用的函数迭代列表因为它们的副作用。

library(DBI)
library(purrr)

conn1 <- dbConnect(drv = RSQLite::SQLite(), dbname = "db1")
conn2 <- dbConnect(drv = RSQLite::SQLite(), dbname = "db2")

connections <- list(conn1, conn2)

walk(connections, ~dbWriteTable(.x, "iris", iris))

答案 1 :(得分:3)

普通管道运算符%>%将前一个函数的结果传递给下一个函数。如果DBI::dbWriteTable函数有效,它将返回TRUE。它不会重新传递传递给它的data.frame

如果您导入magrittr,则可以使用&#34; tee&#34;运营商%T>%。这基本上抛弃了前一个函数返回的内容,并且只是再次传递原始输入。例如

iris %T>%
 DBI::dbWriteTable(conn1, "iris", .) %T>%
 DBI::dbWriteTable(conn2, "iris", .) 

有关T恤操作员的更多信息,请参阅magrittr documentation