2017-07-17 15 views
6

Tôi cần cập nhật các giá trị cột có điều kiện trên các cột khác trong một số bảng cơ sở dữ liệu PostgreSQL. Tôi quản lý để làm điều đó bằng văn bản một câu lệnh SQL trong R và thực hiện nó với dbExecute từ gói DBI.Tôi có thể chạy câu lệnh cập nhật SQL chỉ bằng cú pháp dplyr trong R

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) 

Chỉ có thể sử dụng cú pháp dplyr? Tôi cố gắng, vì tò mò,

con %>% tbl("table_to_update") %>% 
    mutate(var_to_change = if (filter_var == 'filter') 'new value' else var_to_change) 

mà làm việc trong R nhưng rõ ràng là không có gì trong db vì nó sử dụng một tuyên bố select. copy_to chỉ cho phép các tùy chọn appendoverwite, vì vậy tôi không thể xem cách sử dụng trừ khi xóa sau đó thêm các quan sát đã lọc ...

Trả lời

3

Hiện tại dplyr 0.7.1 (với dbplyr 1.1.0) không hỗ trợ , bởi vì nó giả định rằng tất cả các nguồn dữ liệu đều không thay đổi. Phát hành UPDATE qua dbExecute() có vẻ là đặt cược tốt nhất.

Đối với việc thay thế một đoạn lớn hơn trong một bảng, bạn cũng có thể:

  1. Viết khung dữ liệu vào một bảng tạm thời trong cơ sở dữ liệu thông qua copy_to().
  2. Bắt đầu giao dịch.
  3. Issue một DELETE FROM ... WHERE id IN (SELECT id FROM <temporary table>)
  4. Issue một INSERT INTO ... SELECT * FROM <temporary table>
  5. Cam kết giao dịch

Tùy thuộc vào sơ đồ của bạn, bạn có thể có thể làm một đơn INSERT INTO ... ON CONFLICT DO UPDATE thay vì DELETE và sau đó INSERT.

Các vấn đề liên quan