postgresql 如何使用dplyr将本地数据导入只读数据库?

6ss1mwsb  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

WRDS是一个领先的研究数据提供商,为学术界和其他研究人员在商业和相关领域。WRDS提供了一个PostgreSQL数据库,但这是一个只读数据库。
对于某些任务来说,无法将数据写入数据库是一个很大的限制。例如,如果我想使用每日股票收益率运行一个事件研究,我将需要将我的(相对较小的)本地数据集eventscrsp.dsf合并,这大约是18GB的数据。
一个选择是用crsp.dsf的副本维护我自己的数据库,并将events写入该数据库并在那里合并。但我正在寻找一个允许我使用WRDS数据库的选择。不幸的是,没有办法使用copy_todbWriteTable,因为WRDS数据库是只读的。

jaxagkaj

jaxagkaj1#

一个比下面的答案更新的答案是使用dbplyr包中的copy_inline函数,该函数是在有关此主题的issue文件之后添加的。
一种选择是使用类似于以下函数的函数,该函数使用SQL * 将本地数据框转换为远程数据框,即使在使用只读连接 * 时也是如此。

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)
}

这里是一个使用中的函数的例子。函数已经在PostgreSQL和SQL Server上测试过了,但是在SQLite上不起作用(因为缺少VALUES关键字)。我相信它应该在MySQL或Oracle上起作用,因为它们都有VALUES关键字。

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 [iangow@/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

reprex package(v1.0.0)于2021年4月1日创建

相关问题