sqlite3 Python запрос с ошибкой нескольких переменных - PullRequest
1 голос
/ 07 ноября 2011

Я искал ответ на свой вопрос и не смог найти хорошего ответа .... Я использую python с модулем sqlite3 для запроса базы данных. Проблема в том, что я не могу получить SQL-запрос для хранения нескольких переменных. Например ...

Я могу заставить этот запрос работать отлично. ("wordsofar" - это имя переменной)

c.execute("SELECT word FROM wordlist WHERE word LIKE ?", wordsofar)

Однако я не могу заставить этот код работать. («wordsofar» и «noletter» - это имена переменных)

c.execute("SELECT word FROM wordlist WHERE word LIKE ? AND word NOT LIKE ?", (wordsofar, noletter))

выдает ошибку: «Ошибка привязки параметра 0»

Я попытался переписать запрос так, вместо "?" он использует именованное соглашение, такое как показано http://docs.python.org/py3k/library/sqlite3.html (примерно на половине пути вниз по странице), но это не решило проблему.

Любая помощь будет высоко ценится. Спасибо вам!

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Эта строка (которую вы говорите работает) показывает, что wordsofar - это последовательность одного элемента:

c.execute("SELECT word FROM wordlist WHERE word LIKE ?", wordsofar)

В этом случае вторая строка должна быть:

c.execute("SELECT word FROM wordlist WHERE word LIKE ? AND word NOT LIKE ?", 
          wordsofar + (noletter,))

Если noletter - строка, а wordsofar - кортеж (как вы говорите в своем комментарии).

execute() документы говорят, что вторым аргументом всегда является parameters.Если вы используете '?'тогда количество параметров (len(parameters)) равно числу '?'в заявлении sql.

1 голос
/ 07 ноября 2011

Ваш код выглядит нормально.

Проблема в данных. wordsofar или noletter - это объект, который sqlite3 не знает, как хранить.

Одно из решений - засолить объект. Другое решение заключается в предоставлении функций преобразователя и адаптера.

Используйте register_adapter , чтобы зарегистрировать вызываемый объект для преобразования настраиваемого типа Python в один из поддерживаемых типов SQLite.

Документы также описывают, как поставлять конвертеры для обработки обратного преобразования:

SQLite изначально поддерживает только типы TEXT, INTEGER, FLOAT, BLOB и НОЛЬ. Если вы хотите использовать другие типы, вы должны добавить поддержку для них сам. Параметр detect_types и использование пользовательских конвертеров зарегистрировано на уровне модуля register_converter () функция allow вам легко это сделать.

Вот связанный ТАК вопрос с ответами .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...