Устранение проблем с заменой параметров в 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