如何限制/偏移SQLAlchemy ORM关联的结果?
假设我有一个用户模型和一个文章模型,用户和文章之间是一对多的关系。所以我可以像这样访问文章:
user = session.query(User).filter(id=1).one()
print user.articles
但是这样会列出用户的所有文章。如果我想把文章数量限制在10篇呢?在Rails中,有一个叫做all()
的方法,可以设置限制和偏移量。在SQLAlchemy中也有一个all()
的方法,但它不接受参数,那我该怎么做呢?
编辑:
看起来user.articles[10:20]
是有效的,但SQL查询并没有使用10和20。所以实际上它会加载所有匹配的数据,然后在Python中进行过滤?
1 个回答
26
解决办法是使用一种叫做 dynamic
的关系,这在SQLAlchemy的文档中有提到,具体在集合配置技巧的部分。
通过将关系指定为
class User(...):
# ...
articles = relationship('Articles', order_by='desc(Articles.date)', lazy='dynamic')
你就可以写 user.articles.limit(10)
,这样会生成并执行一个查询,来获取这个用户最近的十篇文章。或者,如果你喜欢的话,也可以使用 [x:y]
这种写法,它会自动生成一个 LIMIT
条件。
性能应该是可以接受的,除非你想要查询大约100个用户的最近十篇文章(在这种情况下,至少会向服务器发送101个查询)。