के लिए पैरामीटर प्रतिस्थापन मैं एक IN खंड के लिए SQLite within Python के साथ पैरामीटर प्रतिस्थापन का उपयोग करने का प्रयास कर रहा हूं।SQLite "IN" खंड
import sqlite3
c = sqlite3.connect(":memory:")
c.execute('CREATE TABLE distro (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)')
for name in 'Ubuntu Fedora Puppy DSL SuSE'.split():
c.execute('INSERT INTO distro (name) VALUES (?)', [ name ])
desired_ids = ["1", "2", "5", "47"]
result_set = c.execute('SELECT * FROM distro WHERE id IN (%s)' % (", ".join(desired_ids)),())
for result in result_set:
print result
यह पता प्रिंट:
(1, u'Ubuntu') (2, u'Fedora') (5, u'SuSE')
डॉक्स राज्य के रूप में है कि "[y] कहां अजगर की स्ट्रिंग आपरेशन का उपयोग करते हुए, क्योंकि ऐसा करने आपकी क्वेरी को इकट्ठा नहीं करना चाहिए यहां एक संपूर्ण चल उदाहरण है कि यह दर्शाता है है असुरक्षित है; यह आपके प्रोग्राम को एसक्यूएल इंजेक्शन हमले के लिए कमजोर बनाता है, "मैं पैरामीटर प्रतिस्थापन का उपयोग करने की उम्मीद कर रहा हूं।
जब मैं कोशिश:
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ (", ".join(desired_ids)) ])
मैं एक खाली परिणाम सेट मिलता है, और जब मैं कोशिश:
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ desired_ids ])
मैं:
InterfaceError: Error binding parameter 0 - probably unsupported type.
मैं किसी भी जवाब है कि आशा है कि एक ओर जहां इस सरलीकृत समस्या के लिए काम करेगा, मैं यह इंगित करना चाहता हूं कि वास्तविक क्वेरी जो मैं करना चाहता हूं वह दोगुनी-नेस्टेड सबक्वायरी में है। बुद्धि के लिए:
UPDATE dir_x_user SET user_revision = user_attempted_revision
WHERE user_id IN
(SELECT user_id FROM
(SELECT user_id, MAX(revision) FROM users WHERE obfuscated_name IN
("Argl883", "Manf496", "Mook657") GROUP BY user_id
)
)
सभी उत्तरों के लिए धन्यवाद। जब मैंने अंततः देखा कि मुझे प्रतिस्थापन के हर पैरामीटर के लिए एक प्रश्न चिह्न की आवश्यकता है तो यह बहुत समझ में आया। –