2012-10-05 14 views
10

में ऑब्जेक्ट पहले से मौजूद है या नहीं, मेरे पास Item है जिसका id प्राथमिक कुंजी और स्वत: जेनरेट किया गया है। अब मैं किसी अन्य बाहरी स्रोत से डेटा पढ़ता हूं, Item ऑब्जेक्ट बनाएं, और यह जांचने की आवश्यकता है कि यह ऑब्जेक्ट पहले से ही मेरे items तालिका में मौजूद है या नहीं। मैं यह कैसे करुं?SQLAlchemy: जांचें कि तालिका

+1

क्या यह '' get_or_create'' परिदृश्य है? यदि ऐसा है: http://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create –

+0

@ डेमियनब्रैच, प्रतिक्रिया के लिए धन्यवाद, लेकिन नहीं, यह नहीं है । – missingfaktor

+0

@missingfaktor आप कैसे जानते हैं कि यह पहले से मौजूद है या नहीं? प्राथमिक कुंजी के आधार पर? या कुछ अन्य अनूठी कुंजी? – jadkik94

उत्तर

10

आप उन वस्तुओं के लिए पूछ सकते हैं जिनके समान गुण हैं और यह जांचें कि गणना शून्य से अधिक है या नहीं। अगर आप जाँच कर सकते हैं

from sqlalchemy import exc 

try: 
    session.add(item) 
    session.commit() 
except exc.IntegrityError: 
    session.rollback() 
    print 'This item fails one of the unique/foreign key checks!' 
except: 
    print 'There was another error' 
    raise 
else: 
    print 'Everything is OK' 

यह समस्या है कि यह करने पर कार्य करता है, और फिर वापस रोल है ...

एक अन्य विकल्प:

if session.query(Item.id).filter(Item.email==newItem.email, 
           Item.type==newItem.type).count() > 0: 
    // item exists 
+1

'> 0' अनावश्यक है क्योंकि गिनती() शून्य लौटाती है यदि कोई मिलान नहीं मिलता है और अन्यथा सकारात्मक पूर्णांक होता है। – kalu

+6

@ कalu: "स्पष्ट रूप से स्पष्ट है।" - पायथन –

+2

का ज़ेन गिनती का उपयोग डेटाबेस को और अधिक काम करता है, इसके बाद इसे करने की आवश्यकता होती है। एक कुशल विधि के लिए नीचे मेरा जवाब देखें। – Salami

1

आप इस के लिए कुछ इसी तरह की कोशिश कर सकते गुण अलग-अलग हैं, तो यह काम कर सकता है:

session.query(Item).filter_by(x=item.x, y=item.y).count() == 0 
8

सबसे प्रभावी तरीका उपयोग करना है exists()

q = session.query(Item.id).filter(Item.email==email) 
session.query(q.exists()).scalar() # returns True or False 
संबंधित मुद्दे