2009-06-17 4 views
10

मैं इस लाइन है कि ठीक काम करता है:SQLite पैरामीटर प्रतिस्थापन और उद्धरण

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 

लेकिन मैं SQLite पैरामीटर प्रतिस्थापन के बजाय बजाय स्ट्रिंग प्रतिस्थापन (क्योंकि मैं here देखते हैं कि इस सुरक्षित है) का उपयोग करना चाहते हैं।

यह मेरा (विफल) की कोशिश:

t = (name,) 
c.execute('select cleanseq from cleanseqs WHERE newID="?"',t) 

लेकिन इस लाइन रिटर्न:

'बाइंडिंग आपूर्ति की संख्या गलत है। वर्तमान कथन 0 का उपयोग करता है, और 1 आपूर्ति की जाती है। '

तो मेरे कथन का बायां हिस्सा काम नहीं करता है। मैं एक बाध्यकारी (नाम, टी में) की आपूर्ति कर रहा हूं लेकिन ऐसा लगता है कि प्रश्न चिह्न (?) को पार्स नहीं किया जा रहा है। अगर मैं उद्धरण उद्धरण हटा देता हूं?, यह काम करता है। लेकिन मैं चाहता हूं कि उद्धरण वहां रहें क्योंकि मुझे याद है कि ऐसे मामले हैं जहां मुझे उनकी आवश्यकता है।

तो सवाल यह है:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 
+0

पैरामीटर का उपयोग करना बहुत अच्छा है, यह नहीं है केवल सुरक्षित लेकिन बहुत तेज़। यहां पढ़ें: http://stackoverflow.com/questions/904796/how-do-i-get-around-the-problem-in-sqlite-and-c/926251#926251 – tuinstoel

उत्तर

9
"" के बारे में "

अगर मैं उद्धरण sourronding हटा सकते हैं, यह काम करता है लेकिन मैं उद्धरण वहाँ रहना चाहते हैं के बाद से मुझे याद है कि ऐसी स्थितियां मैं उन्हें जरूरत हैं। ""

जब आप पूरे SQL कथन का निर्माण कर रहे थे तब से आपको याद है कि आप अप्रासंगिक हैं।

नई कहानी है: एक के साथ चिह्नित करें? एसक्यूएल कथन में प्रत्येक स्थान जहां आप एक मूल्य प्रतिस्थापित करना चाहते हैं तो एक मूल्य में एक ट्यूपल में पास करें? -- यह इत्ना आसान है; रैपर यह सुनिश्चित करने के लिए किसी भी स्ट्रिंग को उद्धृत करेगा कि वे स्वीकार्य एसक्यूएल स्थिरांक हैं।

4

चारों ओर खोना उद्धरण: मैं इस लाइन में परिवर्तित करते हैं?

c.execute('select cleanseq from cleanseqs WHERE newID=?',(t,)) 

यह स्ट्रिंग "?" के रूप में इसका इलाज कर रहा है।

क्या आपको एकल की बजाय पूरी अभिव्यक्ति के चारों ओर डबल कोट्स का उपयोग करने की आवश्यकता है?

2

लाइब्रेरी उद्धरण और आपके लिए भागने को संभालेगी। ? आप इस तरह आपकी क्वेरी लिखें:।

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,)) 
13

मैं नामित पैरामीटर बाध्यकारी शैली और अधिक पठनीय लगता है - और sqlite3 यह समर्थन करता है:

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals()) 

नोट: गुजर {'t': t} या locals() के बजाय dict(t=t) अधिक punctiliously सही होगा, लेकिन मेरी राय में यह होता में कई पैरामीटर और/या लंबे नाम होने पर पठनीयता में हस्तक्षेप करें। किसी भी मामले में, मुझे :t? ;-) से बेहतर लगता है।

+0

+1 यह कई बार फिर से जोड़ने के बिना, एक ही क्वेरी में एक चर कई बार फिर से उपयोग करना आसान बनाता है। – Martijn

18

किसी को भी जो मुझे पसंद है उसे इस धागे को मिला और इस तथ्य को अनदेखा करने वाले लोगों द्वारा वास्तव में निराश हो गया कि कभी-कभी आप उद्धरणों को अनदेखा नहीं कर सकते हैं (क्योंकि आप एक कमांड कमांड का उपयोग कर रहे हैं) आप इसे कुछ करके कर सकते हैं का प्रभाव:

var = name + "%" 
c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,)) 

इससे आपको इस स्थिति में वाइल्डकार्ड में स्थानांतरित करने की अनुमति मिल जाएगी।

0

नियमित उपयोगकर्ता

सिर्फ देखा है कि आप "यहाँ अन्य एसक्यूएल surger .. FIELDNAME = \" = + मूल्य sql_string के असुरक्षित पद्धति का उपयोग करके "द्वारा इस मैनुअल करना होगा +" \ ","

इसका एकमात्र तरीका यह है कि आप इसे सही तरीके से पार्स करने के लिए प्राप्त करेंगे। जीतने के लिए SQLite का उपयोग कर । और मुझे बिना किसी अन्य विकल्प के छोड़ दिया, बस उन्हें अपने मूल्यों से बचने से पहले बचें, आप एसक्यूएल इंजेक्शन से बहुत दुखी डेटाबेस के साथ खत्म हो जाएंगे: '(lol