Подтвердить что ты не робот

Проблема с заменой параметра 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 связок, когда я только звоню. Как я могу это исправить?

4b9b3361

Ответ 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 корректно преобразует его в цитируемый объект.