【问题标题】:BaseQuery.paginate() return inconsistent resultsBaseQuery.paginate() 返回不一致的结果
【发布时间】:2016-05-13 07:19:59
【问题描述】:

当我在 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 的函数。在装饰器内部,这些是我使用的代码 sn-ps:

    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。

【问题讨论】:

  • 请提供本示例中使用的 SQLAlchemy 和 MySQL 查询。没有更多上下文,我们无法找到真正的问题。
  • 感谢您通知@jonafato,已经提供了查询及其 sqlalchemy 值。请查看更新内容:)

标签: python-2.7 flask flask-sqlalchemy


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多