SQLAlchemy和limit()

2024-10-01 09:40:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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语句返回45。在

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

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

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

为了调试这个问题,我将原来的查询结果集重命名为d_results2,并创建了d_results,没有限制(300)。我能看到不同。d_results2被限制为4个。在

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

汉努


Tags: 订单db客户机len排序allfilterresults
1条回答
网友
1楼 · 发布于 2024-10-01 09:40:40

多亏了Ilja的评论,这个问题比我想象的要复杂一点,但最终还是把它弄对了。如果有人感兴趣,现在可以查询:

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()

这似乎很管用。在

汉努

相关问题 更多 >