SQLite में पैरामीटर प्रतिस्थापन समस्याओं का निवारण
Python के साथ SQLite3 में पैरामीटर प्रतिस्थापन का उपयोग करते समय समस्याओं का सामना करना पड़ रहा है? यहां एक गहन जांच और एक समाधान है।
एसक्यूएल इंजेक्शन को रोकने के प्रयास में, '?' का उपयोग करके पैरामीटर प्रतिस्थापन उचित है. हालाँकि, इस दृष्टिकोण का उपयोग करते समय एक त्रुटि उत्पन्न हो सकती है। उदाहरण के लिए, निम्नलिखित कोड के साथ:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
त्रुटि "sqlite3.ProgrammingError: आपूर्ति की गई बाइंडिंग की गलत संख्या" होती है, जो दर्शाता है कि कथन एक बाइंडिंग निर्दिष्ट करता है, जबकि आठ प्रदान किए गए हैं। यह समस्या डेटाबेस तालिका के आरंभिक निर्माण से उत्पन्न हुई है। डेटाबेस निर्माण के लिए जिम्मेदार मॉड्यूल में आठ बाइंडिंग होती हैं, जो बेमेल की ओर ले जाती हैं।
cursor.execute("""CREATE TABLE Equipment
(id INTEGER PRIMARY KEY,
name TEXT,
price INTEGER,
weight REAL,
info TEXT,
ammo_cap INTEGER,
availability_west TEXT,
availability_east TEXT)""")
विडंबना यह है कि, '?' को प्रतिस्थापित किया जा रहा है कम सुरक्षित '%s' से समस्या हल हो जाती है:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
self.cursor.close()
इस विरोधाभास के पीछे का कारण कर्सर.execute() अपने दूसरे पैरामीटर को स्वीकार करने के तरीके में निहित है। एक स्ट्रिंग के बजाय, यह एक अनुक्रम की अपेक्षा करता है, लेकिन आप लंबाई आठ की एक स्ट्रिंग पास कर रहे हैं।
इस समस्या को सुधारने के लिए, कोड को निम्नलिखित में समायोजित करें:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
यह संशोधन सुनिश्चित करता है कि पैरामीटर प्रतिस्थापन उद्देश्य के अनुसार काम करता है। हमेशा सुनिश्चित करें कि cursor.execute() को दिया गया दूसरा पैरामीटर SQL कथन में बाइंडिंग की निर्दिष्ट संख्या से मेल खाता है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3