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

Write table to multiple database connections using pipes

我创建了两个 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

输出的变体

对于 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))

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

如果导入 magrittr,则可以改用 "tee" 运算符 %T>%。这基本上丢弃了之前的函数 returns 并再次传递原始输入。例如

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

请参阅 magrittr documentation 了解更多关于 tee 运算符的信息。