Пользователь pysqlite вводит в операторе select - PullRequest
1 голос
/ 04 марта 2009

Используя pysqlite, как пользовательский тип может быть использован в качестве значения в сравнении, e. g: «... ГДЕ columnName> userType»?

Например, я определил тип bool с необходимой регистрацией, конвертером и т. Д. Pysqlite / Sqlite отвечает ожидаемым образом для операций INSERT и SELECT (bool 'True' сохраняется как целое число 1 и возвращается как True).

Но происходит сбой, когда bool используется в «SELECT * from tasks WHERE display = True» или «... WHERE display =« True ». «В первом случае Sqlite сообщает об ошибке, что столбец с именем True отсутствует. А во втором случае никакие записи не возвращаются. Селект работает, если вместо True используется 1. Кажется, у меня возникает та же проблема при использовании собственных адаптеров даты и времени pysqlite.

Я могу обойти это поведение для этого и других типов пользователей, но это не так весело. Хотелось бы узнать, возможно ли использование пользовательского типа в запросе, или нет, чтобы я не бился головой об эту конкретную стену.

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 марта 2009

Используйте правильный способ передачи переменных в запросы: Не создавайте запрос, используйте вопросительные знаки и передавайте параметры в виде кортежа execute().

myvar = True
cur.execute('SELECT * FROM tasks WHERE display = ?', (myvar,))

Таким образом, драйвер sqlite будет использовать значение напрямую. Больше не нужно убегать, цитировать, преобразование.

Используйте эту технику для каждого параметра, даже для строки, целого числа и т. Д. Таким образом, вы автоматически избегаете внедрения SQL.

0 голосов
/ 04 марта 2009

Вы, вероятно, должны привести его к правильному типу. Попробуйте "ВЫБРАТЬ * ИЗ ЗАДАЧ ГДЕ (display = CAST ('True' AS bool))".

...