2011-12-21 13 views
13

मैं ओआरएम के बिना एसक्लाक्लेमी का उपयोग कर रहा हूं, यानी बैकएंड डीबी के साथ सीधे बातचीत करने के लिए हस्तनिर्मित एसक्यूएल स्टेटमेट्स का उपयोग कर। मैं इस उदाहरण में पीजी का उपयोग अपने बैकएंड डीबी (psycopg2 डीबी ड्राइवर के रूप में) के रूप में कर रहा हूं - मुझे नहीं पता कि यह उत्तर को प्रभावित करता है या नहीं।एसक्लएल्चेमी: पिछले रिकॉर्ड की आईडी प्राप्त करने के लिए

मैं इस तरह बयान है (संक्षिप्तता के लिए, मान लें कि Conn डाटाबेस के लिए एक वैध कनेक्शन है):

conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 

भी मान लें कि उपयोगकर्ता तालिका (आईडी [धारावाहिक प्राथमिक कुंजी] स्तंभ होते हैं, नाम, country_id)

मैं नया उपयोगकर्ता (आदर्श की आईडी कैसे प्राप्त कर सकते हैं, डाटाबेस फिर से टकराने के बिना?)

+0

एसक्यूएलकेमी के साथ इसका क्या संबंध है? –

उत्तर

14

आप INSERT statement इस तरह की RETURNING खंड उपयोग करने में सक्षम हो सकता है:

rslt_id = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING id") 
+1

के लिए धन्यवाद निश्चित रूप से मुझे क्या चाहिए। लौटाया गया ऑब्जेक्ट दोनों मामलों में एक परिणामप्रभाव था, इसलिए मुझे इसे काम करने के लिए कोड को थोड़ा छोटा करना था (fetchone() को कॉल करके)। –

+7

वैकल्पिक रूप से, 'user.insert()। वापसी (user.c.id) .values ​​({'name': 'Homer', 'country_id': 123})' – Pakman

+0

यह समाधान 'sqlite' के साथ काम नहीं करता है। इसका परिणाम 'sqlalchemy.exc.CompileError: रिटर्निंग इस बोलीभाषा के कथन कंपाइलर द्वारा समर्थित नहीं है।'। अन्य समाधान ('lastrowid') उस मामले में काम करता है। –

13

उपयोगकर्ता lastrowid

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 
result.lastrowid 
+3

यह psycopg2 ड्राइवर का उपयोग कर पीजी डीबी के साथ काम नहीं करता है। –

+0

क्षमा करें मेरे पास मेरी मेज पर pgsql नहीं है मैंने mysql का उपयोग किया :) – Nilesh

+6

अधिक विशेष रूप से, यह बिना किसी ओड के टेबल के साथ काम नहीं करता है, जो वर्तमान में डिफ़ॉल्ट है। और वैसे भी यह अक्सर वह ओड नहीं है जिसे आप ढूंढ रहे हैं: रिटर्निंग एक बेहतर समाधान है। – piro

0

वर्तमान SQLAlchemy documentation पता चलता है

result.inserted_primary_key:

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING *") 

आप केवल id जिसके परिणामस्वरूप चाहते हैं कार्य करना चाहिए!

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