2017-07-17 2 views
6

ausführen Ich muss Spaltenwerte conditionnaly in anderen Spalten in einigen PostgreSQL Datenbanktabelle aktualisieren. Ich schaffte es, eine SQL-Anweisung in R schreiben und es mit dbExecute von DBI Paket ausführen.Kann ich eine SQL-Aktualisierungsanweisung nur mit der dplyr-Syntax in 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) 

Ist es möglich, dies nur mit dplyr Syntax zu tun? Ich habe versucht, aus Neugier,

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

, die in R funktioniert aber offensichtlich tut nichts in db, da es eine select Anweisung verwendet. copy_to erlaubt nur für append und overwite Optionen, also kann ich nicht sehen, wie es zu benutzen, es sei denn, dann löschen die gefilterten Beobachtungen anhängt ...

Antwort

3

Aktuelle dplyr 0.7.1 (mit dbplyr 1.1.0) dies nicht unterstützt , weil angenommen wird, dass alle Datenquellen unveränderbar sind. Die Ausgabe eines UPDATE über dbExecute() scheint die beste Wette zu sein.

Für einen größeren Brocken in einer Tabelle zu ersetzen, könnten Sie auch:

  1. den Datenrahmen Schreiben in eine temporäre Tabelle in der Datenbank über copy_to().
  2. Starten Sie eine Transaktion.
  3. Ausgabe ein DELETE FROM ... WHERE id IN (SELECT id FROM <temporary table>)
  4. Ausgabe ein INSERT INTO ... SELECT * FROM <temporary table>
  5. Commit die Transaktion

auf Ihrem Schema Je könnten Sie in der Lage sein, eine einzelne INSERT INTO ... ON CONFLICT DO UPDATE statt DELETE und dann INSERT zu tun.

Verwandte Themen