Timedelta на основе значения столбца таблицы - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть таблица с 10k URL-адресами rss_feed, которые я хочу анализировать в разное время из-за частоты, с которой они публикуются.В моей таблице фидов у меня есть следующие столбцы:

  1. rss_url (строка)
  2. last_parsed_at (дата-время UTC с часовым поясом)
  3. частота (целое)

Я хочу получить все объекты подачи, которые должны быть поставлены в очередь, на основе частоты.Столбец частоты - это количество секунд.

Я пытался использовать следующий запрос

rss_query=db.session.query(Feed).filter(Feed.rss_url.isnot(None)).filter(Feed.available==True).filter(Feed.last_parsed_at+timedelta(seconds=Feed.frequency)<datetime.utcnow())

Я получаю следующую ошибку

TypeError: неподдерживаемый тип для timedeltaКомпонент секунд: InstrumentedAttribute

1 Ответ

0 голосов
/ 14 февраля 2019

Python's timedelta не понимает конструкции SQLAlchemy;это имеет дело с числами в Python.Чтобы создать интервальное выражение SQL, вы должны использовать Язык выражений SQL для создания подходящей конкретной конструкции СУБД.В случае с Postgresql вы можете использовать функции make_interval():

rss_query = db.session.query(Feed).\
    filter(Feed.rss_url.isnot(None)).\
    filter(Feed.available).\
    filter(Feed.last_parsed_at +
           func.make_interval(0, 0, 0, 0, 0, 0, Feed.frequency) <
           datetime.utcnow())

К сожалению func функции не поддерживают именованные аргументы, поэтому вам нужно передать годы, месяцы, недели, дни, часы и минуты в явном виде.

Другой вариант - использовать некоторую арифметику:

filter(Feed.last_parsed_at +
       cast('1 second', Interval) * Feed.frequency <
       datetime.utcnow())
...