2011-09-19 22 views
9

मेरे postgres क्वेरी का उपयोग postgres में पंक्ति आईडी को चुना गया:सम्मिलित किए गए करने के लिए कैसे या अजगर

query = """INSERT INTO statustable(value) SELECT '%s' 
       WHERE NOT EXISTS (SELECT id, value FROM statustable 
       WHERE value = '%s') RETURNING id""" % (status, status) 
    cursor_postgres.execute(query) 
    conn_postgres.commit() 
    statusId = cursor_postgres.fetchone()[0] 
    print "statusId" + str(statusId) 

मैं अगर यह मौजूद नहीं करता है हाल में डाला स्थिति मान आईडी मिलता है, या उसके आईडी चयन करने के लिए करता है, तो पहले से ही मौजूद जरूरत है। RETURNING id ने इस क्वेरी को पूरी तरह से दबाया है इसलिए मुझे इसे चुनिंदा प्रविष्टि काम करने के लिए कम से कम इसे हटा देना पड़ा।

कोई संकेत कैसे स्थिति प्राप्त करने के लिए यहां आईडी? एक और उदाहरण में मैं एक अप्सर्ट कर रहा हूं। (अगर मौजूद नहीं है, तो अन्यथा अपडेट करें) यहां फिर से, मुझे डाली गई या अपडेट की गई पंक्ति आईडी की आवश्यकता है। (नहीं, मैं संग्रहित प्रक्रियाओं का उपयोग कर रहा है, कि यदि आपका पहला सवाल था ...)

अग्रिम

+0

यह मुझे मारता है कि ऐसा करने का सबसे तेज़ तरीका शायद तीन प्रश्न (लेनदेन के भीतर, यदि आवश्यक हो) करना है। 1) "स्थाई कहां से मूल्य आईडी = '% s'"% (स्थिति) 2) यदि कोई पंक्ति वापस नहीं आती है, "स्थाई (मान), '% s'"% (स्थिति) में शामिल करें। 3) "चयन वक्र (pk_seq)" जो भी pk_seq को आपकी प्राथमिक कुंजी आईडी के अनुक्रम के रूप में कहा जाता है। लेकिन चूंकि यह आपने नहीं पूछा है, यह जवाब में नहीं है। उत्तर @ed के लिए –

+0

धन्यवाद। वास्तव में 2 और 3 को स्थिर (मूल्य), '% s' वापसी आईडी "स्थिति (स्थिति) में 'INSERT द्वारा विलय किया जा सकता है क्योंकि यह आईडी भी वापस कर देगा। लेकिन मैं इसे सब एक में डाल रहा था। – jerrymouse

उत्तर

10

धन्यवाद मैं नहीं कह सकता मैं पूरी तरह से किसी एक क्वेरी पर जोर के लिए आपकी प्रेरणा को समझते हैं। मुझे लगता है कि आपकी सबसे अच्छी शर्त दो सरल प्रश्न हैं:

  1. SELECT id FROM statustable WHERE value = '%s'। यदि प्रविष्टि मौजूद है, तो यह आपको आईडी देता है, जिस स्थिति में चरण 2 छोड़ें;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id। यह आपको नव निर्मित प्रविष्टि के id देगा।

आखिरकार - हालांकि मैंने यह सत्यापित नहीं किया है कि यह एक समस्या है - fetchone() एक प्रतिबद्धता में थोड़ा संदिग्ध दिखता है।

+0

के लिए धन्यवाद replay @aix, मैंने बस यही किया, मैंने अपनी क्वेरी को 2 में फोर्क किया। एकल क्वेरी के लिए मेरी प्रेरणा सिर्फ यह जांचने के लिए थी कि यह किया जा सकता है क्योंकि यह किया जा सकता है। fetchone() को एक प्रतिबद्धता में उपयोग किया जाता है क्योंकि वापसी आईडी नहीं होती है ' टी प्रतिबद्ध आईडी जब तक प्रतिबद्ध नहीं है। (मुझे कोई भी प्रकार नहीं मिला) – jerrymouse

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