我可以 运行 一个 SQL 更新语句只使用 R 中的 dplyr 语法吗

Can I run an SQL update statement using only dplyr syntax in R

我需要在某些 PostgreSQL 数据库 table 的其他列上有条件地更新列值。我设法在 R 中编写了一个 SQL 语句并使用 DBI 包中的 dbExecute 执行它。

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 只允许 appendoverwite 选项,所以我不知道如何使用它,除非删除然后附加过滤后的观察结果...

当前的 dplyr 0.7.1(带有 dbplyr 1.1.0)不支持这个,因为它假定所有数据源都是 immutable。通过 dbExecute() 发布 UPDATE 似乎是最好的选择。

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

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

根据您的模式,您可以执行单个 INSERT INTO ... ON CONFLICT DO UPDATE 而不是 DELETE,然后执行 INSERT.