2009-09-05 14 views
26

Mam ciąg nowych obiektów. Wszyscy wyglądają podobnie do tego:sqlalchemy łatwy sposób wstawić lub zaktualizować?

Foo (pk_col1 = X pk_col2 = Y Val = 'bar')

Niektóre z nich są Foo że istnieje (np tylko Val różni się od wiersza w dB) i powinien generować kwerendy aktualizacji. Pozostałe powinny generować inserty.

mogę myśleć kilka sposobów robienia tego, najlepszy byt:

pk_cols = Foo.table.primary_key.keys() 
for f1 in foos: 
    f2 = Foo.get([getattr(f1, c) for c in pk_cols]) 
    if f2 is not None: 
     f2.val = f1.val # update 
     # XXX do we need to do session.add(f2) 
     # (or at least keep f2 alive until after the commit?) 
    else: 
     session.add(f1) # insert 

session.commit() 

Czy istnieje prostszy sposób?

+0

To wygląda na duplikat http://stackoverflow.com/questions/708762/sqlalchemy-insert-or-replace-equivalent lub http://stackoverflow.com/questions/1330475/how-do-i-efficiently -do-a-bulk-insert-or-update-with-sqlalchemy –

+1

@Duffy - Nie to samo pytanie, co naprawdę muszę rozróżnić w Pythonie aktualizacje z insertów, nie mogę tego zrobić w bazie danych z -portowalne rozszerzenie SQL. – Eloff

Odpowiedz

36

Myślę, że jesteś po new_obj = session.merge(obj). Spowoduje to połączenie obiektu w stanie odłączonym z sesją, jeśli klucze podstawowe są zgodne i spowoduje utworzenie nowego obiektu w inny sposób. Tak więc session.save(new_obj) będzie działać zarówno przy wstawianiu jak i aktualizacji.

+8

'' session.save() '' nie wydaje się już istnieć w nowych wersjach sqlalchemy. –

-3
Session.save_or_update(model) 
+9

save_or_update jest przestarzałe od 0,5 lub więcej. To nie zadziała, ponieważ wszystkie nowe obiekty będą wyglądały tak samo dla sqlalchemy (prawdopodobnie wydadzą aktualizacje). Nie sądzę, że będzie to powodowało zapytania, które faktycznie istnieją jako pierwsze. – Eloff

+3

Testowane i sqlalchemy wykonuje wszystkie WKŁADY, a następnie barfy z błędem integralności istniejących obiektów. – Eloff

Powiązane problemy