2015-09-08 9 views
6

Sono stato in grado di utilizzare il costrutto di aggiornamento correlato mostrato nei documenti here per aggiornare una colonna in una tabella.Aggiornamento correlato SQLAlchemy per più colonne

Ad esempio:

sel = select([UpdateTable.column]).\ 
     where(UpdateTable.id == OrigTable.id) 

up = update(OrigTable).values(column=sel) 

che produce SQL come:

UPDATE origtable SET column=(SELECT updatetable.column 
FROM updatetable 
WHERE updatetable.id = origtable.id) 

E 'possibile utilizzare il Declaritive o query Api per aggiornare più colonne per una selezione?

sto cercando di emulare qualcosa di simile a quanto segue in PostgreSQL:

UPDATE origtable 
    SET 
    column1 = updatetable.column1, 
    column2 = updatetable.column2 
    FROM updatetable 
    WHERE origtable.id == updatetable.id 

EDIT:

Sembra che la formattazione di questa una singola istruzione potrebbe non essere possibile con l'API SQLAlchemy corrente.

Tuttavia, una soluzione alternativa che utilizza due selezioni sembra possibile utilizzando la soluzione da here.

+1

[Questa soluzione] (http://stackoverflow.com/questions/30185056/update-a-table-from-another-table-with-multiple-columns-in-sqlalchemy/30211905 # 30211905) non è ottimale ma potrebbe essere chiuso abbastanza per quello che ti serve. – lrnzcig

+0

Grazie a @lrnzcig, ho pensato che qualcosa del genere potesse essere possibile. Immagino che l'API corrente non lo supporti direttamente. – amckinley

+0

Prego. (Se è stato utile, potrei suggerire un +1 per la soluzione collegata. Grazie.) – lrnzcig

risposta

0

Poiché questo è per Postgresql, è possibile utilizzare il supporto di SQLAlchemy multiple table update. La documentazione è solo per core, ma il Query API è costruito in cima core, e possiamo apply that knowledge:

session.query(OrigTable).\ 
    filter(OrigTable.id == UpdateTable.id).\ 
    update({OrigTable.column1: UpdateTable.column1, 
      OrigTable.column2: UpdateTable.column2}, 
      synchronize_session=False) 

che si traduce in

UPDATE origtable 
SET column1=updatetable.column1, 
    column2=updatetable.column2 
FROM updatetable 
WHERE origtable.id = updatetable.id 
Problemi correlati