2017-07-17 41 views
6

我需要更新某些PostgreSQL數據庫表中其他列的列值conditionnaly。我設法做到了在R中編寫一條SQL語句並使用dbExecuteDBI包中執行它。我可以在R中使用dplyr語法運行SQL更新語句嗎

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選項,所以我不能看到如何使用它,除非刪除然後追加過濾意見...

回答

3

當前dplyr 0.7.1(與dbplyr 1.1.0)不支持此因爲它假設所有數據源都是不可變的。通過dbExecute()發行UPDATE似乎是最好的選擇。

對於表更換一個更大的塊,你還可以:

  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

相關問題