首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy和limit()

SQLAlchemy和limit()
EN

Stack Overflow用户
提问于 2017-06-30 18:42:48
回答 1查看 9.7K关注 0票数 2

有人能帮上忙吗?我有一个问题(见下文)

代码语言:javascript
复制
dets = config.Se.query(db.A).filter(db.B.clientref != None, 
                                    db.A.id == db.B.clientref, 
                                    db.A.ignored == False).\
            order_by(desc(db.B.date_lts))

if _querya != ():
    tmp_dets = dets.filter(*_querya)
    dets = tmp_dets

d_results2 = dets.limit(300).all()
d_results = dets.all()
print len(d_results2), len(d_results)

在我的测试查询中,print语句返回4 5。

我做错了什么?我只从表A中进行选择(即使我使用与A具有多对一关系的表B来限制和排序结果集)。假设表A包含客户,表B包含包括date_lts (最后一次看到)的订单,我希望对结果集进行排序,以便最先显示具有最新订单的客户。

我们可以忽略_querya。它允许设置额外的过滤器来查询,这样就可以很好地工作。

我希望将表A中的结果集限制在最多300行,以避免在用户设置过宽的查询参数时GUI阻塞。然而,我注意到,一个测试查询应该返回5行(从数据库确认),但只返回4行。

为了进行调试,我将原始查询结果集重命名为d_results2,并创建了无限制的d_results (300)。我能看出不同之处。d_results2被限制为四个。

怎么一回事?我假设limit(300)不会做任何事情,因为整个结果集只有五行。

Hannu

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-30 20:44:35

多亏了Ilja的评论,这个问题比我想象的要复杂一点,但最终还是成功地解决了。如果有人感兴趣,这是现在的查询:

代码语言:javascript
复制
dets = config.Se.query(db.A, db.B).join(db.B).distinct(db.A.id).\
          filter(db.B.clientref != None, 
                 db.A.id == db.B.clientref, 
                 db.A.ignored == False).order_by(db.A.id)

if _querya != ():
    tmp_dets = dets.filter(*_querya)
    dets = tmp_dets

d_results = dets.from_self().order_by(db.B.date_lts.desc()).limit(300).all()

这似乎是可行的。

Hannu

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44844574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档