sql >> Databáze >  >> RDS >> PostgreSQL

Jak získám místní data do databáze pouze pro čtení pomocí dplyr?

Jednou z možností je použít něco jako následující funkci, která změní místní datový rámec na vzdálený datový rámec pomocí SQL i při použití připojení pouze pro čtení .

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

Zde je ilustrace používané funkce. Funkce byla testována na PostgreSQL a SQL Server, ale nebude fungovat na SQLite (kvůli nedostatku VALUES klíčové slovo, které funguje tímto způsobem). Věřím, že by to mělo fungovat na MySQL nebo Oracle, protože ty mají VALUES klíčové slovo.

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




  1. Rychlý způsob, jak zjistit počet řádků tabulky v PostgreSQL

  2. Omezení křížové tabulky MS SQL Serveru

  3. Jak spustit Create Table DDL s EXECUTE IMMEDIATE v Oracle Database

  4. Jak zmenšit/vymazat soubor ibdata1 v MySQL