sqlite3 Python запрос с ошибкой нескольких переменных

1

Я просмотрел весь ответ на свой вопрос и не нашел хорошего ответа.... Я использую 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 (примерно на половину пути вниз по странице), но это не решило проблему.

Любая помощь приветствуется. Спасибо!

Теги:
sqlite3

2 ответа

1
Лучший ответ

Эта строка (которая, как вы говорите, работает) показывает, что 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.

  • 0
    На самом деле обе переменные являются кортежами. Но это исправление второго запроса работает отлично! Спасибо!
1

Вы хорошо выглядите.

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

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

Используйте register_adapter для регистрации вызываемого для преобразования настраиваемого типа типа Python в один из поддерживаемых типов SQLites.

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

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

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

  • 0
    "wordsofar" в настоящее время является кортежем. И первый запрос sql принимает это просто отлично. Вот почему я подумал, что это проблема кода, а не типа данных. В настоящее время у меня есть эта строка над запросом, чтобы преобразовать ее в кортеж "wordsofar = (wordsofar,)", если у меня нет этой строки и я оставляю переменную как строковые данные, это выдает ошибку, что было слишком много предоставленных аргументов. Как бы я использовать параметр register_adapter или register_converter (), чтобы это исправить? Я только изучаю Python и не могу понять, что делать на сайте docs.python.org. Спасибо вам за помощь!
  • 0
    Не могли бы вы показать содержимое двух переменных и объяснить, что вы пытаетесь достичь с ними? В первом случае первое значение в wordsofar привязывается к единственному «?». Во втором вы просите привязать весь кортеж к первому «?».
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню