2009-09-05 13 views
26

मेरे पास नई वस्तुओं का अनुक्रम है। वे सभी इस के समान दिखाई देते हैं:sqlalchemy डालने या अपडेट करने का आसान तरीका?

फू (pk_col1 = एक्स, pk_col2 = y, वैल = 'बार')

उन में से कुछ फू है कि मौजूद (यानी केवल वैल पंक्ति से DB में अलग कर रहे हैं) और अद्यतन क्वेरी उत्पन्न करना चाहिए। दूसरों को आवेषण उत्पन्न करना चाहिए।

मैं ऐसा करने का कुछ तरीके के बारे में सोच सकते हैं, सबसे अच्छा किया जा रहा है:

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

वहाँ एक आसान तरीका है?

+0

यह http://stackoverflow.com/questions/708762/sqlalchemy-insert-or-replace-equivalent या http://stackoverflow.com/questions/1330475/how-do-i- कुशलता से डुप्लिकेट जैसा दिखता है -do-a-bulk-insert-or-update-with-sqlalchemy –

+1

@Duffy - एक ही सवाल नहीं है क्योंकि मुझे वास्तव में पाइथन में सम्मिलन से अद्यतनों में अंतर करने की आवश्यकता है, मैं इसे डेटाबेस में गैर- -पोर्ट योग्य एसक्यूएल एक्सटेंशन। – Eloff

उत्तर

36

मुझे लगता है कि आप new_obj = session.merge(obj) के बाद हैं। यदि प्राथमिक कुंजी मेल खाते हैं और अन्यथा एक नया बना देंगे तो यह किसी ऑब्जेक्ट को अलग-अलग स्थिति में सत्र में विलय करेगा। तो session.save(new_obj) दोनों डालने और अपडेट के लिए काम करेगा।

+8

'session.save()' 'sqlalchemy के नए संस्करणों में अब मौजूद नहीं प्रतीत होता है। –

-3
Session.save_or_update(model) 
+9

save_or_update को 0.5 या उससे भी कम समय से हटा दिया गया है। यह काम नहीं करेगा क्योंकि सभी नई ऑब्जेक्ट्स SQLLchechemy (शायद यह अपडेट जारी करेगी) के समान दिखाई देगी, मुझे नहीं लगता कि यह वास्तव में पहले मौजूद होने के लिए प्रश्न जारी करेगा। – Eloff

+3

इसका परीक्षण किया गया और SQLLchemy सभी प्रविष्टियों और फिर मौजूदा वस्तुओं पर एक अखंडता त्रुटि के साथ barfs करता है। – Eloff

संबंधित मुद्दे