Оператор SQLite Python AND не работает

Я пытаюсь получить список строк из базы данных 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 для использования жестко заданных значений, он работает.

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

Какие-либо предложения?


person Kyle Browning    schedule 01.03.2011    source источник


Ответы (4)


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

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

_points.execute(sql_statement)

Это должно избежать сопоставления строк, которое оператор выполнения не может выполнить.

Удачи!

person Paul Rigor    schedule 04.05.2011

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

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

person Bernhard    schedule 01.03.2011
comment
Я попытался преобразовать их в строки, используя str(day) и т. д., но безуспешно. _points.execute("""SELECT * FROM points WHERE strftime('%H', checkintime) == ? AND strftime('%w', checkintime) == ?""", (str(time), str(day))) - person Kyle Browning; 01.03.2011

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

_points.execute("""SELECT * FROM points WHERE strftime('%%H', checkintime) == ? AND strftime('%%w', checkintime) == ?""", (str(time), str(day)))
person Martin Stone    schedule 01.03.2011
comment
(1) (или вам нужны кавычки в строке запроса) неясно и/или ересь - пожалуйста, объясните. (2) Заполнители не преобразуются в %-стиль. Символ-заполнитель внутри строкового литерала SQL не является заполнителем... в select 'Huh??', foo from bar where zot = ? только последний ? является заполнителем. - person John Machin; 01.03.2011
comment
Нет, это не работает. Ни %%H, ни %H не работают :( И я действительно не считаю возможным, что escpaing происходит таким образом, потому что все, что мне нужно сделать, это заменить? на «2», и это работает . - person Kyle Browning; 01.03.2011
comment
@John: (1) хорошая мысль! Отредактировано. (2) Я имею в виду, что если %-форматирование Python будет выполнено в какой-то момент при замене заполнителей, то %s потребуется экранировать. У меня было это в прошлом, хотя проверка моего старого кода была с pymssql: мне приходилось говорить `... как 'prefix%%' всякий раз, когда были заполнители. - person Martin Stone; 01.03.2011

попробуйте так: _points.execute("""SELECT * FROM points WHERE strftime('%H', checkintime) == ? AND strftime('%w', checkintime) == ?"""%(время, день))

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

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

person jojo    schedule 01.03.2011
comment
ValueError: неподдерживаемый символ формата «H» (0x48) в индексе 38 - person Kyle Browning; 01.03.2011