微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 dplyr 查询保存到 dbplyr 中的不同模式

如何解决将 dplyr 查询保存到 dbplyr 中的不同模式

我有一个 JDBC 连接,想从一个架构查询数据并保存到另一个架构

library(tidyverse)
library(dbplyr)
library(rJava)
library(RJDBC)

# access the temp table in the native schema
tbl(conn,"temp")

temp_ed <- temp %*% mutate(new = 1)

# I would like to save temp_ed to a new schema "schmema_new"

我想使用类似 dbplyr::compute() 的东西,但要专门定义输出架构。似乎可以使用 dbplyr::copy_to,但需要通过本地机器传输数据。

我想使用类似 RJDBC::dbSendUpdate() 的东西,但理想情况下,它可以与上面的数据操作管道很好地集成。

解决方法

我使用 dbExecute 包中的 DBI 执行此操作。

关键思想是提取定义当前远程表的查询,并使其成为写入该表的更大 SQL 查询中的子查询。这要求 (1) 模式存在,(2) 您有写新表的权限,以及 (3) 您知道正确的 SQL 语法。

直接执行此操作可能如下所示:

tbl(conn,"temp")
temp_ed <- temp %*% mutate(new = 1)

save_table_query = paste(
    "SELECT * INTO my_database.schema_new.my_table FROM (\n",dbplyr::sql_render(temp_ed),"\n) AS sub_query"
  )

dbExecute(conn,as.character(save_table_query))

INTO 是在 SQL Server 中编写新表的子句(我使用的 SQL 风格)。您需要为您的数据库找到等效的子句。

在实践中,我使用了一个看起来像这样的自定义函数:

write_to_database <- function(input_tbl,db,schema,tbl_name){
  # connection
  tbl_connection <- input_tbl$src$con

  # SQL query
  sql_query <- glue::glue(
    "SELECT *\n","INTO {db}.{schema}.{tbl_name}\n","FROM (\n",dbplyr::sql_render(input_tbl),"\n) AS sub_query"
  )

  result <- dbExecute(tbl_connection,as.character(sql_query))
}

在您的上下文中应用:

tbl(conn,"temp")
temp_ed <- temp %*% mutate(new = 1)
write_to_database(temp_ed,"my_database","schema_new","my_table")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。