2009-09-05 16 views
26

Yeni nesneler dizim var. Hepsi bu benzer şekilde görünür:sqlalchemy eklemek veya güncellemek için kolay yolu?

fan (pk_col1 = x pk_col2 = y, val = 'bar')

Bunlardan bazıları ana kadar (yani sadece val db satır farklıdır Foo olan ve güncelleme sorguları oluşturmalı. Diğerleri ekler oluşturmalı.

Bunu yapmanın birkaç yollar geliyor, iyi varlık:

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() 

daha kolay bir yolu var mı?

+0

Bu, http://stackoverflow.com/questions/708762/sqlalchemy-insert-or-replace-equivalent veya http://stackoverflow.com/questions/1330475/how-do-i-efficient gibi bir kopyası gibi görünüyor. -do-a-bulk-insert-veya-update-with-sqlalchemy –

+1

@Duffy - Aslında, python'daki eklentileri eklerden ayırt etmem gerektiği gibi aynı soruya değil, veritabanında bunu non-non Taşınabilir SQL uzantısı. – Eloff

cevap

36

Sana new_obj = session.merge(obj) sonra olduğunu düşünüyorum. Bu, birincil anahtarlar birbiriyle eşleşirse ve yeni bir tane yaparsa, bir nesneyi bağımsız bir durumda birleştirir. Yani hem ekleme hem de güncelleme için session.save(new_obj) çalışacaktır.

+8

'' session.save() '' artık sqlalchemy'nin yeni sürümlerinde görünmüyor. –

-3
Session.save_or_update(model) 
+9

save_or_update, 0,5'ten beri kullanımdan kaldırılmıştır. Tüm yeni nesneler, aynı zamanda, sqlalchemy ile aynı görünecektir (muhtemelen güncellemeleri yayınlayacaktır) gibi çalışmayacaktır. İlk önce hangi gerçek olduğunu görmek için sorguları yayınlayacağını düşünmüyorum. – Eloff

+3

Test edildi ve sqlalchemy tüm INSERTS yapar ve sonra var olan nesneler üzerinde bir bütünlük hatası ile barfs. – Eloff

İlgili konular