SQLAlchemy and limit()



谁能帮忙?我有一个查询(见下文(

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 并创建了无限制 (300( d_results。我可以看到差异。d_results2仅限于四个。

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

汉努

感谢评论中的 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()

这似乎有效。

汉努

最新更新