Я переношу свой код с sqlite3
на peewee
, и пока он отлично работает, однако я не могу понять, как перенести этот запрос:
query = ("SELECT * FROM things
WHERE Fecha substr(Fecha,7)||'/'||substr(Fecha,4,2)||'/'||substr(Fecha,1,2)
BETWEEN ? AND ?", my_field, my_second_field)
На peewee я зашел так далеко:
where_condition = database.fecha.fn.Substr(database.fecha, 7)
.concat('/')
.concat(database.fecha.fn.Substr(database.fecha, 4,2))
.concat('/')
.concat(database.fecha.fn.Substr(database.fecha, 1,2))
.between(my_field, my_second_field)
database.select().where(where_condition)
Но это не работает, и я не знаю, как объединить подстроки в peewee.
>>> 'TextField' has no attribute 'fn'
Обновлено:
Очень важно, чтобы where_condition была внешней переменной, так как это всего лишь 1 фильтр из многих. Я делаю разные фильтры по другому методу, а затем передаю их вместе в where
в виде кортежа (я думаю, что функция fn
не работает из-за этого). Полный код этого:
for record in database.select().where(*self.build_where_conditions())
# Do something
def build_where_conditions(self):
where_condition = []
# first_thing
if self.checkfirst_thing.isChecked():
where_condition.append(database.first_thing == first_thing)
# something
if self.checksomething.isChecked():
where_condition.append(database.something == something)
# client
if self.checkclient.isChecked():
where_condition.append(database.client == client)
# Serie
if self.checkSerie.isChecked():
where_condition.append(database.code.startswith("{0}{1}".format("18", serie)))
# Code
if self.checkCode.isChecked():
where_condition.append(database.code.between(
"{0}{1}".format("18", code1),
"{0}{1}".format("18", code2)))
# NOTE: Must always return a tuple
if len(where_condition) >= 1:
return where_condition
return (None,)
Приветствуются любые предложения о том, как это сделать правильно.
"fn" должно быть само по себе. Это не атрибут (как и сказано в ошибке ... да).
from peewee import fn
where_condition = fn.Substr(TheModel.the_text_field, 7)
.concat('/')
.concat(fn.Substr(TheModel.the_text_field, 4,2))
.concat('/') ... etc
Разберитесь в импорте fn. Каким-то образом я подумал, что это атрибут, и подумал, что у Textfield его просто нет (я странный студент, застревающий в странных местах, но ваша библиотека великолепна!). Только одно, не могли бы вы объяснить, почему я не должен возвращать None? если я верну пустой кортеж, я просто получу
TypeError: reduce() of empty sequence with no initial value