BaseQuery.paginate()返回不一致的结果

时间:2016-05-13 07:19:59

标签: python-2.7 flask flask-sqlalchemy

当我在MySQL中手动执行此查询时,我得到的结果数是28:

    SELECT *
    FROM position_reporting_structures prs
    INNER JOIN positions AS pos ON pos.id = prs.reports_to
    INNER JOIN jobs ON jobs.id = pos.job_id
    INNER JOIN position_fulfillments AS pf ON pf.position_id = pos.id
    INNER JOIN parties ON parties.id = pf.party_id
    WHERE jobs.title LIKE '%QA/QC%' OR parties.name LIKE '%QA/QC%';

这是上面查询的解释SQLAlchemy值:

    query = (
          PositionReportingStructure.query 
          .join(Position,
                Position.id == PositionReportingStructure.reports_to)
          .join(Job,
                Job.id == Position.job_id)
          .join(PositionFulfillment,
                PositionFulfillment.position_id == Position.id)
          .join(Party,
                Party.id == PositionFulfillment.party_id)
          .filter(db.or_(
                Job.title.like('%QA/QC%'),
                Party.name.like('%QA/QC%')))
     )

我有一个分页装饰器,它包装一个返回值为BaseQuery的函数。在装饰器内部,这些是我使用过的代码片段:

    query = f(*args, **kwargs)

    page = 1 // just a dummy value
    per_page = 5 // just a dummy value
    paginate = query.paginate(page=page, per_page=per_page)

我希望它会返回或多或少6页和28项,但事实并非如此。结果是 1 page,4 items per page,4 total itemsno previous/next pages ,这是不正确的。为了进一步调查,我尝试更改page变量的值来比较每个变量:

  • page = 1:1页,共4项,共4项
  • page = 2:6页,3项,共28项
  • page = 3:6页,2项,共28项
  • page = 4:6页,3项,共28项
  • page = 5:6页,5项,共28项
  • page = 6:6页,3项,共28项

您可能会注意到,每页商品太不一致了。有谁可以解释导致这种意外情况的原因?我目前正在使用Flask-SQLAlchemy-2.0。谢谢你的帮助! :)

1 个答案:

答案 0 :(得分:0)

我已经知道这个问题的根本原因。我的查询返回一些重复的行,我认为SQLAlchemy不接受这些行,因此返回时自动给出不同的行(即使不使用GROUP BY或DISTINCT)。

正如我的问题的上下文所述,我在per_page函数的paginate参数中传递了5个项目的计数,在第一页,它只会返回4个项目,因为它将因此,重复的,满足分页函数的条件语句(强调的条件语句):

    **if page == 1 and len(items) < per_page:
        total = len(items)**
    else:
        total = self.order_by(None).count()