r - 将 dplyr 查询保存到 postgresql

标签 r postgresql tidyverse dbi dbplyr

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

如何使用 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于2020年10月9日创建(v0.3.0)

提前致谢

最佳答案

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

我刚刚使用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 [<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="20524f5449464552601112170e100e100e11" rel="noreferrer noopener nofollow">[email protected]</a>: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于2020年10月9日创建(v0.3.0)

关于r - 将 dplyr 查询保存到 postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64285225/

相关文章:

linux - iptables 删除与 postgres 的输入连接

linux - 如何在 Oracle Linux 6.4 x64 上安装 PostGIS?

r - 表函数不适用于具有日期类的日期 - R

r - 多行中出现的匹配对

r - 将函数中的变量存储在全局环境中

r - 根据 R 中列的值分解行

SQL MAX 函数和字符串

r - 在数据帧 R 中取消嵌套数据帧

r - 使用情景回归模型进行预测

r - 如何访问检查包裹时可能出现的任何注释?