我可以在 R 中仅使用 dplyr 语法运行 SQL 更新语句吗

问题描述 投票:0回答:1

我需要有条件地更新某些 PostgreSQL 数据库表中其他列的列值。我设法在 R 中编写 SQL 语句并使用

dbExecute
包中的
DBI
执行它。

library(dplyr)
library(DBI)

# Establish connection with database
con <- dbConnect(RPostgreSQL::PostgreSQL(), dbname = "myDb",
                 host="localhost", port= 5432, user="me",password = myPwd)

# Write SQL update statement
request <- paste("UPDATE table_to_update",
                 "SET var_to_change = 'new value' ",
                 "WHERE filter_var = 'filter' ")

# Back-end execution
con %>% dbExecute(request)

是否可以仅使用

dplyr
语法来做到这一点?出于好奇,我尝试了

con %>% tbl("table_to_update") %>%
   mutate(var_to_change = if (filter_var == 'filter') 'new value' else var_to_change)

它在 R 中工作,但显然在 db 中没有任何作用,因为它使用

select
语句。
copy_to
只允许
append
overwrite
选项,所以我看不到如何使用它,除非删除然后附加过滤后的观察结果...

r dplyr rstudio rpostgresql r-dbi
1个回答
5
投票

当前的 dplyr 0.7.1(带有 dbplyr 1.1.0)不支持这一点,因为它假设所有数据源都是不可变的。通过

UPDATE
发出
dbExecute()
似乎是最好的选择。

要替换表中较大的块,您还可以:

  1. 通过
    copy_to()
    将数据框写入数据库中的临时表。
  2. 开始交易。
  3. 发出
    DELETE FROM ... WHERE id IN (SELECT id FROM <temporary table>)
  4. 发出
    INSERT INTO ... SELECT * FROM <temporary table>
  5. 提交交易

根据您的架构,您可能可以执行单个

INSERT INTO ... ON CONFLICT DO UPDATE
,而不是
DELETE
,然后执行
INSERT

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.