2010-05-13 23 views
7

मैंने एसक्यूएलकेमी को 0.6 तक अपडेट किया है लेकिन यह सब कुछ तोड़ दिया है। मैंने देखा है कि यह टुपल को अब एक शब्दकोश नहीं देता है। यहां एक नमूना क्वेरी है:SQLAlchemy tuple शब्दकोश नहीं देता

query = session.query(User.id, User.username, User.email).filter(and_(User.id == id, User.username == username)).limit(1) 
result = session.execute(query).fetchone() 

कोड का यह टुकड़ा 0.5 में एक शब्दकोश को वापस करने के लिए उपयोग किया जाता था।

मेरा सवाल है कि मैं एक शब्दकोश कैसे वापस कर सकता हूं?

+2

बस उत्सुक: क्यों आप 'session.query (उपयोगकर्ता) .Get (आईडी)' ऐसा नहीं करते हैं (यह मानते हुए User.id प्राथमिक कुंजी है) । या 'session.query (उपयोगकर्ता)। फ़िल्टर (User.id == आईडी)। फ़िल्टर (उपयोगकर्ता। उपयोगकर्ता नाम == उपयोगकर्ता नाम)। सबसे पहले()' यदि आईडी प्राथमिक कुंजी नहीं है। ऐसा करें, और आप एक उपयोगकर्ता उदाहरण वापस प्राप्त करेंगे, और आप विशेषता लुकअप द्वारा फ़ील्ड मानों तक पहुंच सकते हैं। – codeape

उत्तर

5

यह काम करना चाहिए: dict(zip(['id','username','email'],result)) (या यदि आप पाइथन 3.x पर हैं तो आप एक शब्दकोश समझ का उपयोग कर सकते हैं)।
इसके अलावा, आपको ऑब्जेक्ट पर session.execute पर कॉल करने की आवश्यकता नहीं है। आप इसके बजाय .one() विधि का उपयोग करना चाहेंगे। यह आपकी क्वेरी के अंत में .limit(1) कॉल लटकने की आवश्यकता को भी रोकता है।

+0

हां, यह काम करता है। धन्यवाद। मैं सीमा (1) का उपयोग करता हूं क्योंकि जब मैं SQL कथन को देखता हूं SQLALchemy इस कोड के लिए बनाता है तो इसमें क्वेरी में LIMIT 1 शामिल नहीं है। – Ivan

8

क्या आप वाकई ResultProxy नहीं हैं जो इसे मुद्रित करते समय एक टुपल होने का नाटक करते हैं? ओआरएम में कई वस्तुएं उनके __str__ फ़ंक्शन रिटर्न नहीं हैं।

+0

+1 जब तक मैं इसे पढ़ नहीं पाया तब तक मैं पूरी तरह से अंधेरा हो रहा था। पढ़ने के बाद, मैं बस आगे बढ़ गया और फील्ड नामों का उपयोग करने की कोशिश की और यह पूरी तरह से काम किया! मुझे बहुत सिरदर्द बचाया। धन्यवाद। –

33

session.execute एक dict कभी नहीं वापस आ गया है, यह एक RowProxy वस्तु, कि एक dict की तरह अनुक्रमित किया जा सकता स्थितीय देखने के लिए या तो पूर्णांक कुंजियों का उपयोग देता है, स्ट्रिंग कुंजी लेबल के लिए आधारित देखने के लिए ऊपर या स्तंभ वस्तुओं मूल्य देखने के लिए उस कॉलम का। यहां समस्या यह है कि session.execute(query) ऐसा नहीं करता है जो आपको लगता है कि ऐसा करने की उम्मीद है। यह क्वेरी ऑब्जेक्ट को एक चयन कथन में परिवर्तित करता है, इसे निष्पादित करता है और परिणाम सीधे देता है। परिणामसेट को ओआरएम स्तर की विशेषताओं के बारे में कुछ नहीं पता है। 0.5 विज्ञापन 0.6 के बीच क्या बदल गया है कि ओआरएम प्रश्नों में कॉलम लेबल करने के लिए एक अलग एल्गोरिदम का उपयोग करता है, अब यह तालिका में लेबल नाम को प्रीपेड करता है। तो जब पहले row['id'] काम करने के लिए हुआ, तो अब row['users_id'] काम करता है। दोनों मामलों में row[User.__table__.columns['id']] काम करता है।

ORM पर अमल करने के लिए क्वेरी आप वास्तव में .all(), .first() और .one() तरीकों का उपयोग करें या इसे या संख्यात्मक अनुक्रमण का उपयोग करने पर पुनरावृति करना चाहिए। क्वेरी रिटर्न नाम टुपल ऑब्जेक्ट्स। इसकी कुंजी के साथ टपल ज़िप यदि आप एक dict हैं:

row = session.query(User.id, User.username, User.email)\ 
    .filter(and_(User.id == id, User.username == username)).first() 
print("id=%s username=%s email=%s" % row) # positional 
print(row.id, row.username) # by label 
print(dict(zip(row.keys(), row))) # as a dict