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

694   8  

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

    Ничего не найдено.