SQLite Python AND оператор не работает - PullRequest
1 голос
/ 01 марта 2011

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

SELECT * FROM points
WHERE strftime('%H', checkintime) == '12'
  AND strftime('%w', checkintime) == '1'

Это работает, и я получаю все строки, которые я должен получить. Однако, когда я пытаюсь сделать это в Python:

_points.execute("""SELECT * FROM points WHERE strftime('%H', checkintime) == ? AND strftime('%w', checkintime) == ?""", (time, day))

Где время 12, а день 1, я получаю ноль результатов. Что еще более странно, когда я изменяю оператор execute на использование жестко закодированных значений, он работает.

Я пытался типизировать мои переменные как для строк, так и для целых, но это все еще не получится. (

Есть предложения?

Ответы [ 4 ]

1 голос
/ 01 марта 2011

Значения времени и дня должны быть строками. Кроме того, мне интересно, нужно ли экранировать ваш '%' (с %%) - возможно, что внутри pysqlite заполнители ? преобразуются в% -тильные, а затем ваши% H и% w будут неправильно интерпретированы. Работает ли следующее?

_points.execute("""SELECT * FROM points WHERE strftime('%%H', checkintime) == ? AND strftime('%%w', checkintime) == ?""", (str(time), str(day)))
1 голос
/ 01 марта 2011

Я считаю, что вы должны преобразовать свои числовые параметры в строки, иначе они не будут заключены в кавычки, как вы делаете в своем выражении в sqlite. Подстановка переменной с? не цитирует числа.

Вы на самом деле сравниваете строки, поэтому необходимо преобразовать параметры в строки.

0 голосов
/ 04 мая 2011

Как насчет обработки строки вне вызова execute?Например,

sql_statement = """SELECT * FROM points WHERE strftime('%s', checkintime) == %s AND strftime('%s', checkintime) == %s""" % ('%H', time, '%w', day)

_points.execute(sql_statement)

Следует избегать сопоставления строк, которое не может выполнить инструкция execute.

Удачи!

0 голосов
/ 01 марта 2011

попробуй так: _points.execute ("" "ВЫБРАТЬ * ИЗ ТОЧКИ, ГДЕ strftime ('% H', checkintime) ==? AND strftime ('% w', checkintime) ==?" "" % (время, день))

обратите внимание на% (время, день)

Я не уверен насчет% H и% w, не знаю, какой формат времени и дня

...