استكشاف مشكلات استبدال المعلمات في SQLite
هل تواجه مشكلات عند استخدام استبدال المعلمات في SQLite3 مع Python؟ فيما يلي تحقيق متعمق وحل.
في محاولة لمنع حقن SQL، استبدال المعلمة باستخدام '?' من المستحسن. ومع ذلك، قد ينشأ خطأ عند استخدام هذا النهج. على سبيل المثال، باستخدام الكود التالي:
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()
يكمن السبب وراء هذه المفارقة في الطريقة التي يقبل بها Cursor.execute () المعلمة الثانية الخاصة به. بدلاً من سلسلة واحدة، فإنه يتوقع تسلسلاً، ولكنك تقوم بتمرير سلسلة من طول ثمانية.
لتصحيح هذه المشكلة، قم بضبط التعليمات البرمجية على ما يلي:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
يضمن هذا التعديل أن استبدال المعلمة يعمل على النحو المنشود. تأكد دائمًا من أن المعلمة الثانية التي تم تمريرها إلى Cursor.execute() تتوافق مع العدد المحدد من الارتباطات في عبارة SQL.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3