Я просмотрел весь ответ на свой вопрос и не нашел хорошего ответа.... Я использую 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))
Это дает мне ошибку: "Error binding parameter 0"
Я попытался переписать запрос так, вместо "?" он использует именованное соглашение, такое как показано http://docs.python.org/py3k/library/sqlite3.html (примерно на половину пути вниз по странице), но это не решило проблему.
Любая помощь приветствуется. Спасибо!
Эта строка (которая, как вы говорите, работает) показывает, что 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()
docs говорят, что вторым аргументом всегда являются parameters
. Если вы используете '?' то число параметров (len(parameters)
) равно числу "?" в инструкции sql.
Вы хорошо выглядите.
Проблема в данных. Либо wordsofar, либо noletter - это объект, который sqlite3 не знает, как хранить.
Одним из решений является рассолкновение объекта. Другим решением является поставка функций преобразователя и адаптера.
Используйте register_adapter для регистрации вызываемого для преобразования настраиваемого типа типа Python в один из поддерживаемых типов SQLites.
В документах также описывается, как поставлять преобразователи для обработки обратного преобразования:
SQLite изначально поддерживает только типы TEXT, INTEGER, FLOAT, BLOB и NULL. Если вы хотите использовать другие типы, вы должны добавить поддержку для них самостоятельно. Параметр detect_types и использование пользовательских преобразователей, зарегистрированных с помощью функции register_converter() на уровне модуля, позволяют вам легко это сделать.
Вот связанный с ним вопрос с ответами.