当我在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 items
和no 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。谢谢你的帮助! :)
答案 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()