«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как решить проблемы с заменой параметров в SQLite при использовании последовательностей вместо строк?

Как решить проблемы с заменой параметров в SQLite при использовании последовательностей вместо строк?

Опубликовано 8 ноября 2024 г.
Просматривать:837

How to Resolve Parameter Substitution Issues in SQLite When Using Sequences vs. Strings?

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

Заявление о выпуске Эта статья перепечатана по адресу: 1729322897. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3