我需要更新某些Postgresql数据库表中其他列的条件值.我设法在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只允许附加和覆盖选项,所以我看不到如何使用它,除非删除然后附加过滤后的观察…
解决方法
当前的dplyr 0.7.1(使用dbplyr 1.1.0)不支持此功能,因为它假定所有数据源都是不可变的.通过dbExecute()发出UPDATE似乎是最好的选择.
要替换表中较大的块,您还可以:
>通过copy_to()将数据帧写入数据库中的临时表.
>开始交易.
>发出DELETE FROM … WHERE id IN(SELECT id FROM< temporary table>)
>发出INSERT INTO … SELECT * FROM< temporary table>
>提交交易
根据您的架构,您可以执行单个INSERT INTO …在CONFLICT DO UPDATE而不是DELETE然后INSERT.