1

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

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

4

2 回答 2

4

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

如果您导入magrittr,则可以改用“tee”运算符%T>%。这基本上会丢弃之前函数返回的任何内容,并再次传递原始输入。例如

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

有关 tee 运算符的更多信息,请参阅magrittr 文档

于 2017-12-14T20:21:59.767 回答
3

作为 MrFlicks 评论的替代方案,您可以使用purrrapply函数族对连接列表进行迭代 using 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))
于 2017-12-14T20:07:24.267 回答