【问题标题】:Save dbplyr query to postgree将 dplyr 查询保存到 postgres
【发布时间】:2021-01-24 20:10:55
【问题描述】:

很抱歉这个非常简单的问题,但是......

如何使用dbplyr 保存查询结果构建而不在内存中加载数据。

这是我尝试过的。

library(DBI)
library(odbc)
library(RPostgreSQL)
library(tidyverse)
library(magrittr)
#> 
#> Attaching package: 'magrittr'
#> The following object is masked from 'package:purrr':
#> 
#>     set_names
#> The following object is masked from 'package:tidyr':
#> 
#>     extract
library(dbplyr)
#> 
#> Attaching package: 'dbplyr'
#> The following objects are masked from 'package:dplyr':
#> 
#>     ident, sql

pgdrv <- dbDriver(drvName = "PostgreSQL")
con <-dbConnect(pgdrv,
               dbname="genomes",
               host="127.0.0.1", port=5432,
               user = 'rotifer')

mtcars %<>% 
  rownames_to_column()

dbWriteTable(con, "cars", mtcars)
#> [1] TRUE

dbmtcars <- tbl(con, "cars") 

dbmtcars %>% 
  mutate(ts = cyl * carb) -> newtb

newtb %>% show_query()
#> <SQL>
#> SELECT "row.names", "rowname", "mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear", "carb", "cyl" * "carb" AS "ts"
#> FROM "cars"

newtb %>% db_write_table(con, "newtb")
#> Error in UseMethod("db_write_table"): no applicable method for 'db_write_table' applied to an object of class "c('tbl_PostgreSQLConnection', 'tbl_dbi', 'tbl_sql', 'tbl_lazy', 'tbl')"

reprex package (v0.3.0) 于 2020 年 10 月 9 日创建

提前致谢

【问题讨论】:

    标签: r postgresql tidyverse dbi dbplyr


    【解决方案1】:

    使用db_save_query 会有所帮助。在您的情况下,代码将是:

    db_save_query(con = con, sql = sql_render(newtb),temporary = F,table = "newtb")
    

    但是,我找不到从不同连接连接两个表的方法。如果有人知道怎么做,请告诉我。

    【讨论】:

      【解决方案2】:

      我暂时找到了答案,我不知道如何解释,但它确实有效。

      我刚刚使用db_computedb_sql_render 来处理要执行的查询并保存在新表中。 db_compute(con=con, sql=db_sql_render(con, newtb), table="newtb")

      完整代码如下:

      library(DBI)
      library(odbc)
      library(RPostgreSQL)
      library(tidyverse)
      library(magrittr)
      #> 
      #> Attaching package: 'magrittr'
      #> The following object is masked from 'package:purrr':
      #> 
      #>     set_names
      #> The following object is masked from 'package:tidyr':
      #> 
      #>     extract
      library(dbplyr)
      #> 
      #> Attaching package: 'dbplyr'
      #> The following objects are masked from 'package:dplyr':
      #> 
      #>     ident, sql
      
      pgdrv <- dbDriver(drvName = "PostgreSQL")
      con <-dbConnect(pgdrv,
                     dbname="genomes",
                     host="127.0.0.1", port=5432,
                     user = 'rotifer')
      
      mtcars %<>% 
        rownames_to_column()
      #> [1] TRUE
      
      dbmtcars <- tbl(con, "cars") 
      
      dbmtcars %>% 
        mutate(ts = cyl * carb) -> newtb
      
      newtb %>% show_query()
      #> <SQL>
      #> SELECT "row.names", "rowname", "mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear", "carb", "cyl" * "carb" AS "ts"
      #> FROM "cars"
      
      db_compute(con=con, sql=db_sql_render(con, newtb), table="newtb")
      #> [1] "newtb"
      dbCommit(con)
      #> [1] TRUE
      
      sbpsigt <- tbl(con, "newtb")
      sbpsigt
      #> # Source:   table<newtb> [?? x 14]
      #> # Database: postgres 10.0.14 [rotifer@127.0.0.1:5432/genomes]
      #>    row.names rowname   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear
      #>    <chr>     <chr>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
      #>  1 1         Mazda …  21       6  160    110  3.9   2.62  16.5     0     1     4
      #>  2 2         Mazda …  21       6  160    110  3.9   2.88  17.0     0     1     4
      #>  3 3         Datsun…  22.8     4  108     93  3.85  2.32  18.6     1     1     4
      #>  4 4         Hornet…  21.4     6  258    110  3.08  3.22  19.4     1     0     3
      #>  5 5         Hornet…  18.7     8  360    175  3.15  3.44  17.0     0     0     3
      #>  6 6         Valiant  18.1     6  225    105  2.76  3.46  20.2     1     0     3
      #>  7 7         Duster…  14.3     8  360    245  3.21  3.57  15.8     0     0     3
      #>  8 8         Merc 2…  24.4     4  147.    62  3.69  3.19  20       1     0     4
      #>  9 9         Merc 2…  22.8     4  141.    95  3.92  3.15  22.9     1     0     4
      #> 10 10        Merc 2…  19.2     6  168.   123  3.92  3.44  18.3     1     0     4
      #> # … with more rows, and 2 more variables: carb <dbl>, ts <dbl>
      
      dbDisconnect(con)
      #> [1] TRUE
      

      reprex package (v0.3.0) 于 2020 年 10 月 9 日创建

      【讨论】:

        【解决方案3】:

        我使用以下模式来保存构造的 SQL 表:

        con <-dbConnect('you connection details here')
        dbmtcars <- tbl(con, "cars") 
        
        newtb = dbmtcars %>% mutate(ts = cyl * carb)
        
        sql_query <- "SELECT *\n",
                     "INTO db_name.schema_name.new_tbl_name\n",
                     "FROM (\n",
                     dbplyr::sql_render(newtb ),
                     "\n) AS alias")
        
        dbExecute(db_connection, as.character(sql_query))
        

        更多详情参见write_to_datebase函数here

        【讨论】:

        • 感谢我使用db_compute(con=con, sql=db_sql_render(con, newtb), table="newtb"),但感谢您的回答。
        猜你喜欢
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        相关资源
        最近更新 更多