Проблема подстановка данных SQLite
используя SQLite3 с Python 2.5, я пытаюсь перебрать список и вытащить вес элемента из базы данных на основе имени элемента.
Я пробовал использовать "?"замена параметров предлагается для предотвращения SQL-инъекций, но это не работает. Например, когда я использую:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
Я получаю ошибку:
sqlite3.ProgrammingError: неверное количество предоставленных Привязок. Текущий оператор использует 1, и есть 8 доставленный.
Я считаю, что это каким-то образом вызвано первоначальным созданием базы данных; модуль, который я сделал, который фактически создает БД, имеет 8 Привязок.
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()
Я не могу понять, почему он думает, что у меня есть 8 bindins, когда я звоню только одному. Как я могу это исправить?
8 ответов:
The
Cursor.execute()метод предполагает последовательность в качестве второго параметра. Вы предоставляете строку, которая оказывается длиной 8 символов.использовать следующий формат:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])ссылка на библиотеку Python: sqlite3 Объекты Курсора.
Я потратил полдня, пытаясь выяснить, почему что-то вроде этого даст мне ошибку:
cursor.execute("SELECT * from ? WHERE name = ?", (table_name, name))только чтобы узнать, что имена таблиц не может быть параметризован. Надеюсь, что это поможет другим людям сэкономить время.
аргумент
cursor.executeчто представляет собой значения заносятся в базу данных должен быть кортеж (последовательность). Однако рассмотрим этот пример и посмотрим, что происходит:>>> ('jason') 'jason' >>> ('jason',) ('jason',)в первом примере вместо этого вычисляется строка; поэтому правильный способ представления однозначного кортежа, как и во втором вычислении. Во всяком случае, код ниже, чтобы исправить вашу ошибку.
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,))кроме того,
cursor.executeзначения аргументов в виде строк, (что вы и делаете) результаты в первой оценке в Примере и результаты в ошибку, которую вы получаете.
вы пробовали это ? :
for item in self.inventory_names: t = (item,) self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", t) self.cursor.close()курсор.execute () ожидает последовательность (список,Кортеж) в качестве второго параметра. (-> ddaa )
цитирование (это то, что означает parens?) что ? с parens, кажется, работает для меня. Я продолжал пытаться (буквально)'?- но я продолжал получать
ProgrammingError: неверное количество предоставленных Привязок. Текущий оператор использует 0, и есть 1 поставляется.
когда я это сделал:
выберите факт из фактоидов, где ключ нравится (?)
вместо:
выберите факт из фактоидов, где ключ Например?-
Это сработало.
Это какой-то питон 2.6 вещь?
каждый элемент элементов должен быть кортежем. предполагая, что имена выглядит примерно так:
names = ['Joe', 'Bob', 'Mary']вы должны сделать следующее:
for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item, ))С помощью (item,) вы делаете его кортеж вместо строки.
The
sqlite3модуль два виды заполнителей для параметров:стиль qmark
используйте один или несколько
?чтобы отметить положение каждого параметра и предоставить список или кортеж параметров. Например:curs.execute("SELECT weight FROM Equipment WHERE name = ? AND price = ?", ['lead', 24])стиль
использовать
:parзаполнители для каждого именованного параметра и укажите dict. Например:curs.execute("SELECT weight FROM Equipment WHERE name = :name AND price = :price", {name: 'lead', price: 24})преимущества именованных параметров стиля в том, что вы этого не делаете нужно беспокоиться о порядке параметров, и каждый
:parможет использоваться несколько раз в больших/сложных SQL-запросах.
попробовать
execute("select fact from factoids where key like ?", "%%s%" % val)вы ничего не обернуть вокруг
?вообще, в Python SQLite, которая будет правильно преобразовать его в кавычках сущности.
Comments