2010-09-11 28 views
15

इस post about SQLite में, aaronasterling मुझसे कहा था कि"% s"% प्रारूप बनाम "{0}"। प्रारूप() बनाम "?" प्रारूप

  • cmd = "attach \"%s\" as toMerge" % "b.db": गलत
  • cmd = 'attach "{0}" as toMerge'.format("b.db") है: सही है
  • cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db',)):, सही बात

है लेकिन मैं पहले सोचा है और दूसरा वही हैं। उन तीनों के बीच मतभेद क्या हैं?

+0

मेरे उत्तर में स्पष्टीकरण के लिए खेद है। यह पहले से ही बहुत लंबा लग रहा था;) – aaronasterling

+0

@Aaronasterling: ओह, मैंने सोचा कि यह पोस्ट एक पेज के लायक हो सकता है। उत्तर और मदद के लिए धन्यवाद। – prosseek

उत्तर

17
"attach \"%s\" as toMerge" % "b.db" 

आप " के बजाय ' का उपयोग करना चाहिए, ताकि आप से बचने के लिए नहीं है।

आप पुराने स्वरूपण तार कि अनुचित हैं प्रयोग किया जाता है।

'attach "{0}" as toMerge'.format("b.db") 

यह नए अजगर संस्करण के बजाय यदि संभव हो तो एक पुरानी दुनिया की इस्तेमाल किया जाना चाहिए से नए प्रारूप स्ट्रिंग सुविधा का उपयोग करता।

"attach ? as toMerge"; cursor.execute(cmd, ('b.db',)) 

यह एक स्ट्रिंग स्वरूपण को पूरी तरह से छोड़ देता है और इसके बजाय SQLite सुविधा का उपयोग करता है, इसलिए यह करने का यह सही तरीका है।

बड़ा लाभ: एसक्यूएल इंजेक्शन

3

क्योंकि यह बच नहीं रहा है। यदि आपने उपयोगकर्ता इनपुट के साथ b.db को प्रतिस्थापित किया है, तो यह आपको SQL इंजेक्शन के लिए कमजोर छोड़ देगा।

6

पहले और दूसरे ही परिणाम का उत्पादन है, लेकिन दूसरी विधि पायथन के नए संस्करण में तार फ़ॉर्मेट करने के लिए पसंदीदा है।

हालांकि तीसरे यहां बेहतर दृष्टिकोण क्योंकि यह जोड़ तोड़ तार के बजाय पैरामीटर का उपयोग करता है। यह तेज़ और सुरक्षित दोनों है।

+2

दूसरी विधि, पायथन के नए संस्करणों में पसंदीदा होने के द्वारा, विस्तार से, पाइथन के _all_ संस्करणों में नए कोड के लिए पसंदीदा है जो इसका समर्थन करता है। यह आगे संगतता का एक साधारण मामला है – aaronasterling

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