दिलचस्प पोस्ट
सी # या .NET में आपने अजीब कोने के मामले में क्या देखा है? एक कार्यात्मक तरीके से अपवादों को संभालने के लिए एक बेहतर तरीका 'नल कनवर्टर' के लिए रूपांतरण त्रुटि सेटिंग एक्सप्लोरर की तरह फ़ोल्डर ब्राउज़र नियंत्रण कैसे बनाएं? MySQL में, क्या मैं एक ही तालिका में सम्मिलित करने के लिए एक पंक्ति को कॉपी कर सकता हूँ? ArrayList और पार्सलेबल गतिविधि को पार करने में सहायता सी + + संकलन बग? ++ i और i ++ के बीच अंतर क्या है? JVM के लिए अधिकतम स्मृति का उपयोग कैसे करें? क्या सी के लिए कोई दुभाषिया है? एंड्रॉइड एस्प्रेसो में टोस्ट संदेश की जांच करना मैं पूरी स्क्रिप्ट के आउटपुट को स्क्रिप्ट के भीतर कैसे रीडायरेक्ट कर सकता हूं? एक numpy array में कई मानों के पंक्ति अनुक्रमित खोजें JUnit के साथ यूनिट परीक्षण के लिए IntelliJ IDEA को कॉन्फ़िगर करना एक क्लासपाथ क्या है?

पैरामीटर के रूप में एसक्यूएल क्वेरी में अजगर सूची

मेरे पास एक अजगर सूची है, l का कहना है I

l = [1,5,8] 

मैं सूची के सभी तत्वों के डेटा प्राप्त करने के लिए एक एसक्यूएल क्वेरी लिखना चाहता हूं, कहते हैं

"स्टडन्स से नाम का चयन करें जहां id = | IN सूची में |"

मैं इसे कैसे दूं?

वेब के समाधान से एकत्रित समाधान "पैरामीटर के रूप में एसक्यूएल क्वेरी में अजगर सूची"

उत्तर अभी तक एक सादा एसक्यूएल स्ट्रिंग में मूल्यों को चकमा दे रहा है। यह पूर्णांक के लिए बिल्कुल ठीक है, लेकिन अगर हम इसे स्ट्रिंग के लिए करना चाहते हैं तो हम बचने वाले मुद्दे को प्राप्त करते हैं।

यहां पैरामीटरयुक्त क्वेरी का उपयोग करने वाला एक संस्करण है जो दोनों के लिए काम करेगा:

 placeholder= '?' # For SQLite. See DBAPI paramstyle. placeholders= ', '.join(placeholder for unused in l) query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders cursor.execute(query, l) 

आप चाहते हैं कि एसक्यूएल है

 select name from studens where id in (1, 5, 8) 

यदि आप अजगर से इस का निर्माण करना चाहते हैं तो आप उपयोग कर सकते हैं

 l = [1, 5, 8] sql_query = 'select name from studens where id in (' + ','.join(map(str, l)) + ')' 

मानचित्र फ़ंक्शन सूची को स्ट्रिंग्स की सूची में बदल देगा, जो कि str.join विधि का उपयोग करके कॉमा द्वारा एक साथ चिपका सकते हैं।

वैकल्पिक रूप से:

 l = [1, 5, 8] sql_query = 'select name from studens where id in (' + ','.join((str(n) for n in l)) + ')' 

अगर आप मानचित्र फ़ंक्शन में जनरेटर अभिव्यक्ति पसंद करते हैं।

अद्यतन: एस। लोटे ने टिप्पणियों में उल्लेख किया है कि पायथन एसक्यूलाइट बाइंडिंग अनुक्रमों का समर्थन नहीं करते हैं। उस स्थिति में, आप चाहते हो सकता है

 select name from studens where id = 1 or id = 5 or id = 8 

द्वारा उत्पन्न

 sql_query = 'select name from studens where ' + ' or '.join(('id = ' + str(n) for n in l)) 

इसे जटिल मत करो, इसके लिए समाधान सरल है।

 l = [1,5,8] l = tuple(l) params = {'l': l} cursor.execute('SELECT * FROM table where id in %(l)s',params) 

यहां छवि विवरण दर्ज करें

मुझे आशा है कि यह मदद की !!!

स्ट्रिंग। अल्पविरामों द्वारा अलग किए गए सूची मूल्यों को शामिल करें, और एक क्वेरी स्ट्रिंग बनाने के लिए प्रारूप ऑपरेटर का उपयोग करें।

 myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist)) 

(धन्यवाद, ब्लैयर-कॉनराड )

मुझे बॉबंस का जवाब पसंद है:

 placeholder= '?' # For SQLite. See DBAPI paramstyle. placeholders= ', '.join(placeholder for unused in l) query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders cursor.execute(query, l) 

लेकिन मैंने यह देखा:

 placeholders= ', '.join(placeholder for unused in l) 

इसके साथ बदला जा सकता है:

 placeholders= ', '.join(placeholder*len(l)) 

मुझे यह अधिक सीधा लगता है अगर कम चालाक और कम सामान्य यहां l की लंबाई होना आवश्यक है (यानी किसी वस्तु को संदर्भित करें जो __len__ विधि परिभाषित करता है), जो कि समस्या नहीं होनी चाहिए। लेकिन प्लेसहोल्डर को एक भी अक्षर होना चाहिए। बहु-वर्ण प्लेसहोल्डर का समर्थन करने के लिए:

 placeholders= ', '.join([placeholder]*len(l)) 

@ आरोपित उत्तर के समाधान, क्योंकि यह एक तत्व ट्यूपल के साथ तोड़ दिया गया, चूंकि (1,) मान्य SQL नहीं है:

 >>> random_ids = [1234,123,54,56,57,58,78,91] >>> cursor.execute("create table test (id)") >>> for item in random_ids: cursor.execute("insert into test values (%d)" % item) >>> sublist = [56,57,58] >>> cursor.execute("select id from test where id in %s" % str(tuple(sublist)).replace(',)',')')) >>> a = cursor.fetchall() >>> a [(56,), (57,), (58,)] 

एसक्यूएल स्ट्रिंग के लिए अन्य समाधान:

 cursor.execute("select id from test where id in (%s)" % ('"'+'", "'.join(l)+'"')) 

उदाहरण के लिए, यदि आप SQL क्वेरी चाहते हैं:

 select name from studens where id in (1, 5, 8) 

व्हाट अबाउट:

 my_list = [1, 5, 8] cur.execute("select name from studens where id in %s" % repr(my_list).replace('[','(').replace(']',')') )