2012-09-05 10 views
14

का उपयोग कर पंक्तियों डालने मैं SQLAlchemy के साथ कई पंक्तियों डालने कर रहा हूँ के बाद प्राथमिक कुंजी प्राप्त करें:SQLAlchemy

connection = engine.connect() 
topic_res = connection.execute(message_topics.insert(),[ 
     { 
     'mt_date': time.time(), 
     'mt_title': title, 
     'mt_hasattach':u'0', 
     'mt_starter_id':member.member_id, 
     'mt_start_time': time.time(), 
     'mt_last_post_time': time.time(), 
     'mt_invited_members': u'a:0:{}', 
     'mt_to_count': u'1', 
     'mt_to_member_id':member.member_id, 
     'mt_replies': u'1', 
     } for member in members ]) 
topic_res.inserted_primary_key 

जब मैं डाला प्राथमिक कुंजी प्राप्त करने की कोशिश, और मैं हो रही है: 'MySQLExecutionContext_mysqldb' वस्तु है:
AttributeError कोई विशेषता 'inserted_primary_key', लेकिन डीबग के कारण topic_res 'ResultProxy' ऑब्जेक्ट है।
तो यदि मैं केवल एक पंक्ति डालता हूं तो मैं topic_res.inserted_primary_key प्राप्त कर सकता हूं।

+0

अच्छे उत्तर हैं, कृपया उनमें से किसी के साथ सहमत हों। – I159

उत्तर

13

देखें inserted_primary_key विशेषता एक एकल पंक्ति सम्मिलित करने के लिए केवल कार्यात्मक है:

http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html?highlight=inserted_primary_key#sqlalchemy.engine.base.ResultProxy.inserted_primary_key

This only applies to single row insert() constructs which did not explicitly specify Insert.returning().

यह सब अजगर DBAPIs सहित डेटाबेस क्लाइंट लाइब्रेरी में एक व्यापक रूप से प्रचलित सीमा की वजह से है जहां केवल एक "आखिरी डाली गई आईडी" विशेषता एक समय में उपलब्ध है।

+0

तो MySQL के लिए एक मल्टी डालने और सभी कॉल किए गए आईडी की सूची को एक कॉल में प्राप्त करने का कोई तरीका नहीं है? मैं प्रत्येक पर लूपिंग करने और inserted_primary_key को पुनर्प्राप्त करने के बजाय एक बार में सभी को सम्मिलित करते समय 25x का प्रदर्शन अंतर देख रहा हूं। – Zitrax

+1

जो मुझे पता नहीं है, डीबीएपीआई इसका समर्थन नहीं करता है और MySQL एडाप्टर इस के लिए किसी गैर-मानक एपीआई की पेशकश नहीं करते हैं। यह एक पुराना उत्तर है इसलिए http://docs.sqlalchemy.org/en/rel_0_9/faq.html#im-inserting-400-000-rows-with-the-orm-and-it-s- स्थिति के एक सिंहावलोकन के लिए वास्तव में धीमी गति से। – zzzeek

1

हो सकता है कि आपके ResultsProxy एक सूची या सूची जैसी वस्तु है, तो आप उस वस्तु के तत्वों = db-पंक्तियों पर पुनरावृति करना चाहिए:

for e in topic_res: 
    print e.inserted_primary_key 

संपादित करें: विधि "inserted_primary_key" के लिए ही काम करने लगता है एकल पंक्ति सम्मिलन। http://docs.sqlalchemy.org/en/rel_0_6/core/connections.html#sqlalchemy.engine.base.ResultProxy.inserted_primary_key