2010-07-10 12 views
36

में वर्णों से बचने के लिए मेरे पास एक पाइथन स्क्रिप्ट है जो कच्चे मूवी टेक्स्ट फ़ाइलों को एक एसक्लाइट डेटाबेस में पढ़ती है।पायथन और स्क्लाइट

मैं आवेषण निष्पादित करने से पहले उन्हें डीबी सुरक्षित बनाने के लिए तारों में भागने के तार जोड़ने के लिए re.escape (शीर्षक) का उपयोग करता हूं।

ऐसा क्यों काम नहीं करता है:

In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'") 
--------------------------------------------------------------------------- OperationalError      Traceback (most recent call last) 

/home/rajat/Dropbox/amdb/<ipython console> in <module>() 

OperationalError: near "Allo": syntax error 

फिर भी यह (हटाया \ 'दो स्थानों पर) काम करता है:

In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: <sqlite3.Cursor object at 0x9666e90> 

मैं इसे समझ नहीं कर सकते हैं। मैं उन प्रमुख उद्धरणों को भी नहीं हटा सकता क्योंकि वे वास्तव में फिल्म के शीर्षक का हिस्सा हैं। धन्यवाद।

उत्तर

85

आप इसे गलत कर रहे हैं। सचमुच। आप पैरामीटर्स का उपयोग किया जाना चाहिए, इस तरह:

c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)")) 

कि तरह, आप सभी को उद्धृत करते हुए और (उन मूल्यों को किसी अविश्वस्त से आ रहे हैं) आप 100% सुरक्षित हो जाएगा किसी भी सब करने की ज़रूरत नहीं होगी (यहां) एसक्यूएल इंजेक्शन हमलों से भी।

+5

बिल्कुल। उद्धरण और भागने अंतिम संसाधन kludges हैं। यदि पैरामीटर उपलब्ध हैं, तो उन्हें _always_ – Javier

+2

बीटीडब्लू का उपयोग करें, वही विचार वहां भी नाम के लायक हर दूसरे डेटाबेस के लिए और लगभग हर दूसरे व्यावहारिक प्रोग्रामिंग भाषा में भी काम करता है। * हर कोई * इसे इस तरह से करता है क्योंकि यह * सही * है। –

+0

बहुत बढ़िया धन्यवाद डोनाल। अब सब ठीक काम कर रहे हैं। मैं RoR के साथ समान विधियों का उपयोग करता था, जहां यह अच्छी तरह से प्रलेखित है। लेकिन "पायथन स्क्लाइट से बचने वाले पात्रों" के लिए खोज करने के घंटों ने कुछ भी नहीं दिया। पायथन डॉक्स वांछित होने के लिए बहुत छोड़ देते हैं।धन्यवाद डोनाल और सभी –

8

मैं स्ट्रिंग में बच वर्ण जोड़ने के लिए re.escape (शीर्षक) का उपयोग उन्हें db सुरक्षित

ध्यान दें कि re.escape एक स्ट्रिंग बनाता है फिर से -सुरक्षित बनाने के लिए - कुछ भी नहीं करना इसे डीबी सुरक्षित बनाने के साथ। इसके बजाय, जैसा कि @ डोनल कहते हैं, आपको पैरामीटर प्रतिस्थापन पाइथन डीबी एपीआई - की अवधारणा है कि चीजों को "डीबी सुरक्षित" बनाता है जैसा आपको चाहिए।

4

SQLite बैकस्लैश एस्केप दृश्यों का समर्थन नहीं करता है। स्ट्रिंग अक्षर में Apostrophes उन्हें दोगुना करके इंगित किया जाता है: '''Allo ''Allo! (1982)'

लेकिन, जैसे डोनाल ने कहा, आपको पैरामीटर का उपयोग करना चाहिए।

-2

मेरे पास एक समस्या है जो आप इस समस्या को संभालने के लिए उपयोग कर सकते हैं: जब आपके SQL कथन स्ट्रिंग में एकल उद्धरण होता है: ', तो आप अपनी कथन स्ट्रिंग को संलग्न करने के लिए डबल कोट का उपयोग कर सकते हैं। और जब आपके SQL कथन स्ट्रिंग में डबल कोट्स होते हैं: ", तो आप एकल कथन का उपयोग कर सकते हैं:" अपनी कथन स्ट्रिंग को संलग्न करने के लिए। ईजी।

sqlString="UPDATE movies SET rating = '8.7' WHERE name='Allo Allo !' (1982)" 
c.execute(sqlString) 

या,

sqlString='UPDATE movies SET rating = "8.7" WHERE name="Allo Allo !" (1982)' 
c.execute(sqlString) 

यह समाधान अजगर वातावरण में मेरे लिए काम करता है।

+0

में और क्या होगा यदि आपके द्वारा खोजे जाने वाले मूल्य में डबल-कोट है? डोनाल के जवाब के अनुसार पैरामीटर का प्रयोग करें। या सीमांकन (केवल अंतिम उपाय के रूप में) से बचें (ओपी प्रश्न में एकल उद्धरण; या आपके उदाहरण में डबल-कोट्स) – colminator

+0

कोलिनेटर, मेरी स्ट्रिंग में कोई डबल-कोट नहीं है। यदि आपकी स्ट्रिंग में डबल-कोट है, तो बस "\" " –

+0

का उपयोग करें। आपके पास एक स्थिर उदाहरण है। वास्तविक दुनिया में - WHERE क्लॉज गतिशील होगा। गतिशील सामग्री को बचने के बिना डिलीमीटर विवादों पर भरोसा नहीं किया जा सकता है - चाहे आप उपयोग करें सिंगल या डबल-कोट्स। – colminator

संबंधित मुद्दे