Проблема с заменой параметра 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 связок, когда я только звоню. Как я могу это исправить?
Ответы
Ответ 1
Метод Cursor.execute()
ожидает последовательность как второй параметр. Вы поставляете строку длиной 8 символов.
Вместо этого используйте следующую форму:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
Ссылка на библиотеку Python 13.13.3: sqlite3 Объекты курсора.
Ответ 2
Я потратил полдня, пытаясь понять, почему что-то вроде этого даст мне ошибку:
cursor.execute("SELECT * from ? WHERE name = ?", (table_name, name))
чтобы узнать, что имена таблиц не могут быть параметризованы. Надеюсь, это поможет другим людям сэкономить время.
Ответ 3
Аргумент cursor.execute
, который представляет значения, которые необходимо вставить в базу данных, должен быть кортежем (последовательность). Однако рассмотрите этот пример и посмотрите, что происходит:
>>> ('jason')
'jason'
>>> ('jason',)
('jason',)
Первый пример вместо этого вычисляет строку; поэтому правильный способ представления однозначного кортежа аналогичен во второй оценке. Во всяком случае, код ниже, чтобы исправить вашу ошибку.
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,))
Кроме того, аргументы аргумента cursor.execute
в качестве строк (это то, что вы делаете), приводит к первой оценке в примере и результатам в полученную ошибку.
Ответ 4
Ты пробовал это?
for item in self.inventory_names:
t = (item,)
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", t)
self.cursor.close()
cursor.execute() ожидает, что последовательность (список, кортеж) будет вторым параметром. (- > ddaa)
Ответ 5
Цитата (это то, что означают парнеры?)? с парнесом, похоже, работает на меня. Я продолжал пытаться (буквально)? " но я продолжал получать
ProgrammingError: неверное количество привязок. В текущем операторе используется 0, и есть 1.
Когда я это сделал:
ВЫБЕРИТЕ факт ОТ ФАСОТИДОВ ГДЕ: LIKE (?)
вместо:
ВЫБРАТЬ ФАЙТ ОТ ФАСОТИДОВ ГДЕ КЛЮЧЕВАЙТЕ "?"
Это сработало.
Это какая-то вещь python 2.6?
Ответ 6
каждый элемент элементов должен быть кортежем.
если имена выглядят примерно так:
names = ['Joe', 'Bob', 'Mary']
вы должны сделать следующее:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item, ))
используя (item,), вы делаете его кортежем вместо строки.
Ответ 7
Try
execute("select fact from factoids where key like ?", "%%s%" % val)
Вы вообще ничего не обертываете вокруг ?
, Python sqlite корректно преобразует его в цитируемый объект.