Использование поля SQLAlchemy Integer для создания объекта timedelta для фильтрации

У меня есть объект с именем Item. В нем есть 2 поля: строка даты и времени под названием «created_on» и строка целых чисел под названием «дни».

Я хочу запросить все объекты, которые были созданы «дни» много дней назад.

Вот как я думал, что это должно быть сделано:

now = utcnow()
session.query(Item).filter(Item.created_on + Interval(timedelta(days=Item.days)) <= now)

Но я не могу создать такую ​​временную дельту. Я получаю эту ошибку:

TypeError: unsupported type for timedelta minutes component: InstrumentedAttribute

Обновлять:

Благодаря Вану, я должен использовать встроенную функцию. Я использую Mysql 5.1, так что это будет timestampadd. Мой новый запрос таков:

now = utcnow()
session.query(Item).filter(func.timestampadd('DAY', Item.days, Item.created_on) <= now)

Однако новая ошибка, которую я получаю:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''DAY', items.days, items.created_on) <= '2015-07-12 ' at line 3

person user1005909    schedule 11.07.2015    source источник


Ответы (2)


Я не думаю, что Interval поможет вам в этом, так как он не сможет принуждать к функциям даты [времени], специфичным для БД. Поэтому вам, вероятно, следует использовать функции даты [времени] для конкретной платформы, чтобы решить эту проблему.

Если вы используете postgresql, приведенный ниже код должен работать (при условии, что Items.days является целым числом):

q = (session.query(Item)
     .filter(func.age(now, Item.created_on) <=
             func.make_interval(0, 0, 0, Item.days)
             )
     )

Подробнее см. в разделе postgres' Функции и операторы даты/времени. информация.

person van    schedule 12.07.2015
comment
А что, если Item.days — число с плавающей запятой? - person mpounsett; 14.03.2020
comment
@mpounsett: параметр secs равен double. Так что просто конвертируйте свое значение в секунды и передайте как аргумент secs. - person van; 16.03.2020

person    schedule
comment
Всегда лучше добавить некоторые пояснения к ответам. Таким образом, будущие пользователи смогут лучше понять, в чем заключается ваш вклад. - person DaFois; 27.11.2018