पायथन / psycopg2 जहां बयान में


81

SQL कथन में सूची (देशसूची)% s के माध्यम से उपलब्ध होने की सही विधि क्या है?

# using psycopg2
countryList=['UK','France']

sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)

जैसा कि अब है, "देश में (ARRAY [...]") को चलाने की कोशिश करने के बाद यह त्रुटिपूर्ण है। क्या स्ट्रिंग हेरफेर के माध्यम से ऐसा करने का एक तरीका है?

धन्यवाद

जवाबों:


133

के लिए INऑपरेटर, आप एक चाहते टपल के बजाय सूची एसक्यूएल स्ट्रिंग से, और निकालें कोष्ठकों।

# using psycopg2
data=('UK','France')

sql='SELECT * from countries WHERE country IN %s'
cur.execute(sql,(data,))

डीबगिंग के दौरान आप जाँच सकते हैं कि SQL सही तरीके से बनाया गया है

cur.mogrify(sql, (data,))

शीघ्र जवाब देने के लिए ध्न्यवाद!
मैट

1
यदि आपको इस उत्तर को पढ़ने के बाद भी परेशानी हो रही है, तो इसे बहुत धीरे-धीरे फिर से पढ़ें। यह ट्यूपल्स का एक समूह है और यदि आप उन्हें वहां रखते हैं तो आपको% s के आसपास के परनों को हटाना होगा। इसने मुझे उलझा दिया क्योंकि मेरा एक सरल परीक्षण केवल एक ही मूल्य का उपयोग करता था और सब कुछ काम करता था। बस इसे ठीक उसी तरह फॉलो करें जैसे ब्रायन ने इसे लिखा था।
1

40

उत्तर पर अन्वेषण करने के लिए और नामित मापदंडों को संबोधित करने के लिए, और सूचियों को ट्यूपल्स में परिवर्तित करने के लिए:

countryList = ['UK', 'France']

sql = 'SELECT * from countries WHERE country IN %(countryList)s'

cur.execute(sql, { # You can pass a dict for named parameters rather than a tuple. Makes debugging hella easier.
    'countryList': tuple(countryList), # Converts the list to a tuple.
})

1
हुकुम में पास होने के लिए धन्यवाद। यह बहुत बेहतर है।
जैक

क्या इसे शब्दकोश में कई WH x x खंडों और कई सूचियों के साथ लागू किया जा सकता है?
ओडीसियो

1
सुधार: @Odseseo हाँ, सर्वशक्तिमान या के साथ। उदा:cur.execute("SELECT * FROM table WHERE col IN %(list1)s OR col IN %(list2)s", {'list1': tuple(1,2,3), 'list2' = tuple(4,5,6)})
यहोशू बर्न्स

12

आप सीधे नीचे के रूप में एक अजगर सूची का उपयोग कर सकते हैं। यह SQL में IN ऑपरेटर की तरह कार्य करता है और बिना किसी त्रुटि के भी रिक्त सूची को संभालता है।

data=['UK','France']
sql='SELECT * from countries WHERE country = ANY (%s)'
cur.execute(sql,(data,))

स्रोत: http://initd.org/psycopg/docs/usage.html#lists-adaptation


यह भी स्वीकार किए जाते हैं जवाब लेकिन साथ उपयोग कर सकते हैं cur.execute(sql, (tuple(data),))
एडम ह्यूजेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.