如何限制/抵消 sqlalchemy orm 关系的结果?

Posted

技术标签:

【中文标题】如何限制/抵消 sqlalchemy orm 关系的结果?【英文标题】:how to limit/offset sqlalchemy orm relation's result? 【发布时间】:2012-02-05 09:52:36 【问题描述】:

如果我有一个用户模型和文章模型,用户和文章是一对多的关系。所以我可以访问这样的文章

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】:

解决方案是使用dynamic 关系,如 SQLAlchemy 文档的 collection configuration techniques 部分所述。

通过将关系指定为

class User(...):
    # ...
    articles = relationship('Articles', order_by='desc(Articles.date)', lazy='dynamic')

然后您可以编写user.articles.limit(10),它将生成并执行查询以获取用户最近的十篇文章。或者,如果您愿意,也可以使用 [x:y] 语法,它会自动生成 LIMIT 子句。

性能应该是合理的,除非您想为 100 位左右的用户查询过去 10 篇文章(在这种情况下,至少 101 个查询将被发送到服务器)。

【讨论】:

救了我的命,我试图在子查询中运行 order desc 只是为了嵌套关系,这太难了(互联网上没有例子)

以上是关于如何限制/抵消 sqlalchemy orm 关系的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLAlchemy ORM 上实现对同一属性的自引用多对多关系?

如何将 Sqlalchemy ORM 查询结果转换为包含关系的单个联接表?

ORM SQLAlchemy 表于表的关系

Python开发:ORM sqlalchemy

Python 9 sqlalchemy ORM

SqlAlchemy ORM