2009-05-22 9 views
27

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

+6

किस संदर्भ में आप से बचने चाहते हैं? पायथन तारों के लिए, या डेटाबेस में? – workmad3

+0

यह पोस्टग्रेज़ डेटाबेस क्वेरी का हिस्सा है। –

उत्तर

24

यदि यह एक डाटाबेस क्वेरी का हिस्सा आप एक Parameterized SQL Statement

उपयोग करने में सक्षम होना चाहिए आपके उद्धरण से बचने के रूप में के रूप में अच्छी तरह से , यह सब विशेष वर्ण के साथ सौदा होगा और SQL injection attacks से आप की रक्षा करेगा।

+15

+1: यदि आप डेटाबेस क्वेरी में उद्धरण से बच रहे हैं, तो आप SQL गलत कर रहे हैं। –

+0

+1> मैं एक ही चीज़ पोस्ट करने वाला था :-) –

+0

बढ़िया, अब मुझे सिर्फ पायथन 3.0 की एक प्रति चाहिए। –

0

एक अधिक सामान्य समस्या का समाधान के लिए, मैं एक कार्यक्रम है, जहां मैं एक फ्लैट फ़ाइल में वर्णों के किसी सेट का संग्रह करने के लिए आवश्यक है, टैब सीमांकित जाहिर है, 'सेट' में टैब होने से समस्याएं पैदा हो रही हैं।

output_f.write (str) के बजाय, मैंने output_f.write (repr (str)) का उपयोग किया, जिसने मेरी समस्या हल की। यह पढ़ने के लिए धीमा है, क्योंकि जब मैं इसे पढ़ता हूं तो इनपुट को eval() को इनपुट करने की आवश्यकता होती है, लेकिन कुल मिलाकर, यह कोड क्लीनर बनाता है क्योंकि मुझे अब फ्रिंज मामलों की जांच करने की आवश्यकता नहीं है।

+3

repr/eval एक बुरा विचार है। आप इसके बजाय 'csv' मॉड्यूल का उपयोग कर सकते हैं। यह आपके लिए क्षेत्र में एम्बेड टैब का ख्याल रखेगा – jfs

1

ट्रिपल डबल कोट्स बचने के लिए सबसे अच्छा कर रहे हैं:

string = """This will span across 'single quotes', "double quotes", 
and literal EOLs all in the same string."""
+3

यह इस मामले में काम नहीं करेगा: 'string =" "" यह एक स्ट्रिंग है "जिसमें एक उद्धरण है" "" – dolma33

5

आसान और तारों से बचने के लिए मानक तरीका, और अन्य वस्तुओं को प्रोग्रामेटिक रूप में परिवर्तित करना, repr() फ़ंक्शन में निर्माण का उपयोग करना है। यह किसी ऑब्जेक्ट को उस प्रतिनिधित्व में परिवर्तित करता है जिसे आपको मैन्युअल कोड के साथ दर्ज करने की आवश्यकता होगी।

उदा .:

s = "I'm happy I am \"here\" now" 
print repr(s) 
>> 'I\'m happy I am "here" now' 

कोई अजीब हैक्स, उस में बनाया गया है और यह सिर्फ सबसे प्रयोजनों के लिए काम करता है।

+3

यह शायद ओपी नहीं है चाहता हे। repr उद्धरण से बच निकलता है लेकिन यह सिंगल कोट्स में स्ट्रिंग को भी लपेटता है। उदाहरण के लिए: repr ("किंग्स कैसल") राजा के कैसल बन जाता है "(रैपिंग उद्धरण नोटिस)। –

20

json.dumps का उपयोग करें। पुराने थ्रेड के लिए

>>> import json 
>>> print json.dumps('a"bc') 
"a\"bc" 
+4

यह विफल रहता है जब स्ट्रिंग में यूनिकोड वर्ण शामिल होते हैं: 'प्रिंट json.dumps (u "£")' प्रिंट '' \ u00a3 "' –

2

उत्तर है, लेकिन सबसे अच्छा तरीका अभी भी यहाँ याद आ रही ..

psycopg2 का उपयोग कर रहे हैं, तो यह अमल -method बचने buildin गया है।

cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2)) 

ध्यान दें, कि आप विधि (स्ट्रिंग और टपल) निष्पादित करने के लिए दो तर्क, बजाय पायथन के% ऑपरेटर का उपयोग स्ट्रिंग को संशोधित करने की दे रहे हैं।

उत्तर यहाँ से चोरी: psycopg2 equivalent of mysqldb.escape_string?

1

ट्रिपल एकल उद्धरण आसानी से अक्सर एसक्यूएल प्रश्नों में प्रयोग किया जाता एकल उद्धरण संपुटित देगा:

c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''') 
संबंधित मुद्दे