Een optie is om zoiets als de volgende functie te gebruiken, die een lokaal dataframe verandert in een extern dataframe met behulp van SQL zelfs bij gebruik van een alleen-lezen verbinding .
df_to_pg <- function(df, conn) {
collapse <- function(x) paste0("(", paste(x, collapse = ", "), ")")
names <- paste(DBI::dbQuoteIdentifier(conn, names(df)), collapse = ", ")
values <-
df %>%
lapply(DBI::dbQuoteLiteral, conn = conn) %>%
purrr::transpose() %>%
lapply(collapse) %>%
paste(collapse = ",\n")
the_sql <- paste("SELECT * FROM (VALUES", values, ") AS t (", names, ")")
temp_df_sql <- dplyr::tbl(conn, dplyr::sql(the_sql))
return(temp_df_sql)
}
Hier is een illustratie van de functie die in gebruik is. Functie is getest op PostgreSQL en SQL Server, maar werkt niet op SQLite (vanwege het ontbreken van VALUES
trefwoord dat op deze manier werkt). Ik geloof dat het zou moeten werken op MySQL of Oracle, omdat deze de VALUES
hebben zoekwoord.
library(dplyr, warn.conflicts = FALSE)
library(DBI)
pg <- dbConnect(RPostgres::Postgres())
events <- tibble(firm_ids = 10000:10024L,
date = seq(from = as.Date("2020-03-14"),
length = length(firm_ids),
by = 1))
events
#> # A tibble: 25 x 2
#> firm_ids date
#> <int> <date>
#> 1 10000 2020-03-14
#> 2 10001 2020-03-15
#> 3 10002 2020-03-16
#> 4 10003 2020-03-17
#> 5 10004 2020-03-18
#> 6 10005 2020-03-19
#> 7 10006 2020-03-20
#> 8 10007 2020-03-21
#> 9 10008 2020-03-22
#> 10 10009 2020-03-23
#> # … with 15 more rows
events_pg <- df_to_pg(events, pg)
events_pg
#> # Source: SQL [?? x 2]
#> # Database: postgres [[email protected]/tmp:5432/crsp]
#> firm_ids date
#> <int> <date>
#> 1 10000 2020-03-14
#> 2 10001 2020-03-15
#> 3 10002 2020-03-16
#> 4 10003 2020-03-17
#> 5 10004 2020-03-18
#> 6 10005 2020-03-19
#> 7 10006 2020-03-20
#> 8 10007 2020-03-21
#> 9 10008 2020-03-22
#> 10 10009 2020-03-23
#> # … with more rows