2013-02-23 60 views
12

मैं के रूप में एक क्वेरी निष्पादित करने का प्रयास कर रहा हूँ की संख्या अज्ञात है ..."का चयन करें ... कहां ... में" पैरामीटर

SELECT col2 FROM tab WHERE col1 IN (val1, val2, val3...) 

... जहां मूल्यों में जमा हो जाती मनमानी लंबाई की एक पायथन सूची/tuple। मुझे ऐसा करने के लिए "साफ" तरीका नहीं दिख रहा है।

:

>>> db = connect(":memory:") 
>>> db.execute("CREATE TABLE tab (col1 INTEGER, col2 TEXT)") 
>>> db.execute("INSERT INTO tab VALUES(1,'one')") 
>>> db.execute("INSERT INTO tab VALUES(2,'two')") 
>>> db.execute("INSERT INTO tab VALUES(3,'three')") 
>>> db.execute("INSERT INTO tab VALUES(4,'four')") 
>>> db.execute("INSERT INTO tab VALUES(5,'five')") 
>>> db.commit() 

# Expected result 
>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (1,3,4)").fetchall() 
[(u'one',), (u'three',), (u'four',)] 

>>> vals = (1,3,4) 

>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", vals).fetchall() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied. 

>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", (vals,)).fetchall() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type. 

>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", (','.join(str(val) for val in vals),)).fetchall() 
[] 

>>> 

अब मैं निम्नलिखित है, जो (मुझे लगता है कि ... कृपया मुझे ठीक कर लें मैं गलत हूँ) कर सकते हैं में निर्मित पैरामीटर प्रतिस्थापन, लेकिन यह अभी भी एक सा बदसूरत है सुरक्षा को बरकरार रखे हुए

>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (" + ",".join("?"*len(vals)) + ")", vals).fetchall() 
[(u'one',), (u'three',), (u'four',)] 
>>> 

क्या यह मेरा सबसे अच्छा विकल्प है, या इसके आसपास एक अच्छा तरीका है?

+0

संभावित डुप्लिकेट [SQLite: "जहां कॉल इन (: पीआरएम)" के मूल्यों की बाध्य सूची "(http://stackoverflow.com/questions/4788724/sqlite-bind-list-of-values-to-where -col-in-prm) – rsaxvc

उत्तर

6

अतिरिक्त लाइब्रेरी का उपयोग किए बिना यह आपका सबसे अच्छा विकल्प है। मेरे पास निश्चित रूप से advocated just that technique है, वास्तव में more than once है।

आप एसक्यूएलकेमी का उपयोग करने के लिए भी स्विच कर सकते हैं, जो आपके लिए एसक्यूएल उत्पन्न करता है, लेकिन इसके लिए आपको अपने सीखने की वक्र पर चढ़ने और अपने अधिकांश एप्लिकेशन को फिर से लिखने की आवश्यकता होती है।

+0

पर्याप्त मेला, धन्यवाद। यह खोजना मुश्किल था क्योंकि महत्वपूर्ण शब्द ऐसे सामान्य शब्द हैं ... – glibdud