如何在Flask-SQLAlchemy中对db.session连接查询进行分页?
我们有以下关系:
- 一个人可以有许多电子邮件地址
- 电子邮件服务提供商可以(显然)可以提供多个电子邮件地址
因此,这是多对多的关系。我有三个表:电子邮件,提供者和用户。电子邮件具有两个外部ID,分别用于提供商和用户。
现在,给定一个特定的人,我想打印所有电子邮件提供者及其为该人托管的电子邮件地址(如果存在)。(如果该人在Gmail上没有电子邮件,我仍然希望在结果中使用Gmail。我相信否则,我只需要一个左内联接即可解决此问题。)
我想出了以下子查询的方法(遵循sqlalchemy教程):
email_subq = db.session.query(Emails).\ filter(Emails.user_id==current_user.id).\
subquery()
provider_and_email = db.session.query(Provider, email_subq).\
outerjoin(email_subq, Provider.emails).\
all()
可以正常工作(它返回4个元组(Provider, user_id, provider_id, email_address)
,是我想要的所有信息),但是后来我发现这没有使用Flask BaseQuery
类,因此paginationFlask-SQLAlchemy
提供的功能不起作用。显然db.session.query()
不是Flask-SQLAlchemy Query
实例。
我尝试这样做,Emails.query.outerjoin[...]
但是尽管我想要提供者信息和电子邮件,但只返回电子邮件表中的列。
我的问题:如何用Flask-SQLAlchemy做同样的事情,这样我就不必重新实现已经存在的分页?
我想目前最简单的选择是实现自己的分页功能,但是我很想知道是否还有另一种合适的方法来做到这一点。
回答:
我不确定这是否最终会成为一个长期解决方案,它不能直接解决我对不使用Flask-SQLAlchemy的BaseQuery的担忧,但是实现我想要的最简单的方法是重新实现分页功能。
而且,实际上,使用原始的Flask-SQLAlchemy例程很容易做到这一点:
def paginate(query, page, per_page=20, error_out=True): if error_out and page < 1:
abort(404)
items = query.limit(per_page).offset((page - 1) * per_page).all()
if not items and page != 1 and error_out:
abort(404)
# No need to count if we're on the first page and there are fewer
# items than we expected.
if page == 1 and len(items) < per_page:
total = len(items)
else:
total = query.order_by(None).count()
return Pagination(query, page, per_page, total, items)
以上是 如何在Flask-SQLAlchemy中对db.session连接查询进行分页? 的全部内容, 来源链接: utcz.com/qa/432098.html