我有一个包含10k rss_feed URL的表,由于它们发布的频率,我想在不同的时间解析它。在我的Feed表中,我有以下列:
我希望得到所有根据频率排队的Feed对象。频率列是秒数。
我试图使用以下查询
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 seconds组件的不支持类型:InstrumentedAttribute
Python的timedelta
不理解SQLAlchemy构造;它处理Python中的数字。为了生成间隔SQL表达式,您必须使用SQL Expression Language来生成合适的DBMS特定构造。如果是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())