我需要有条件地更新某些 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
选项,所以我看不到如何使用它,除非删除然后附加过滤后的观察结果...
当前的 dplyr 0.7.1(带有 dbplyr 1.1.0)不支持这一点,因为它假设所有数据源都是不可变的。通过
UPDATE
发出 dbExecute()
似乎是最好的选择。
要替换表中较大的块,您还可以:
copy_to()
将数据框写入数据库中的临时表。DELETE FROM ... WHERE id IN (SELECT id FROM <temporary table>)
INSERT INTO ... SELECT * FROM <temporary table>
根据您的架构,您可能可以执行单个
INSERT INTO ... ON CONFLICT DO UPDATE
,而不是 DELETE
,然后执行 INSERT
。