我需要更新某些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
和overwite
个选项,因此我无法看到如何使用它,除非删除然后附加已过滤的观察结果...
答案 0 :(得分:4)
当前的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
。