PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để lấy dữ liệu cục bộ vào cơ sở dữ liệu chỉ đọc bằng dplyr?

Một tùy chọn là sử dụng một cái gì đó giống như hàm sau để biến một khung dữ liệu cục bộ thành một khung dữ liệu từ xa bằng cách sử dụng SQL ngay cả khi sử dụng kết nối chỉ đọc .

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

Đây là hình ảnh minh họa về chức năng đang được sử dụng. Chức năng đã được thử nghiệm trên PostgreSQL và SQL Server, nhưng sẽ không hoạt động trên SQLite (do thiếu VALUES từ khóa hoạt động theo cách này). Tôi tin rằng nó sẽ hoạt động trên MySQL hoặc Oracle, vì chúng có VALUES từ khóa.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng psql làm cách nào để liệt kê các tiện ích mở rộng được cài đặt trong cơ sở dữ liệu?

  2. lỗi lệnh sử dụng alembic không thể tìm thấy mã định danh

  3. PostgreSQL - Mệnh đề GROUP BY hoặc được sử dụng trong một hàm tổng hợp

  4. Làm thế nào để chuyển đổi cơ sở dữ liệu trong postgres?

  5. Chú thích ngủ đông cho kiểu nối tiếp PostgreSQL