Запись таблицы в несколько подключений к базе данных с использованием каналов

Я создал две базы данных 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


person Danny Morris    schedule 14.12.2017    source источник


Ответы (2)


Обычный оператор канала %>% передавал результат предыдущей функции следующей. Функция DBI::dbWriteTable возвращает TRUE, если она работает. Он не проходит повторно по переданному ему data.frame

Если вы импортируете magrittr, вместо этого вы можете использовать оператор "тройник" %T>%. По сути, это отбрасывает все, что возвращает предыдущая функция, и просто снова передает исходный ввод. Например

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

Дополнительную информацию о футболке см. в документации magrittr. оператор.

person MrFlick    schedule 14.12.2017

В качестве альтернативы комментарию MrFlicks вы можете просто использовать purrr или семейство функций apply для итерации по списку соединений с использованием 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))
person Jake Kaupp    schedule 14.12.2017
comment
не удалось воспроизвести это успешно...Error: Index 1 must be a character or numeric vector - person Danny Morris; 15.12.2017
comment
Это работает в моей настройке, запуская приведенный выше код. Возможно, вы записываете в существующую таблицу, которая выдает ошибку несоответствия типов. - person Jake Kaupp; 15.12.2017