Ale*_*hen 8 python sqlalchemy flask flask-sqlalchemy
说,我们有以下关系:
所以,这是一个多对多的关系.我有三个表:电子邮件,提供商和用户.电子邮件有两个外国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()
Run Code Online (Sandbox Code Playgroud)
这工作正常(它返回一个4元组(Provider, user_id, provider_id, email_address),我想要的所有信息),但我后来发现这不是使用Flask BaseQuery类,因此paginationFlask-SQLAlchemy提供的功能不起作用.显然db.session.query()不是Flask-SQLAlchemy Query实例.
我试图这样做,Emails.query.outerjoin[...]但只返回电子邮件表中的列,虽然我想要提供商信息和电子邮件.
我的问题:我如何使用Flask-SQLAlchemy做同样的事情,这样我就不必重新实现已经存在的分页?
我想在这一点上最简单的选择是实现我自己的paginate函数,但是我想知道是否有另一种正确的方法可以做到这一点.
我不确定这是否会成为长期解决方案,并不能直接解决我对不使用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)
Run Code Online (Sandbox Code Playgroud)
修改了第paginate376行附近的函数:https://github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy.py
Rac*_*ers -1
我可能是错的,但我认为你的问题可能是 .all()。通过使用它,您将获得一个列表,而不是查询对象。
尝试将其保留,并将查询传递给分页方法,如下所示(为了清楚起见,我保留了所有子查询详细信息):
email_query = db.session.query(Emails).filter(**filters)
email_query.paginate(page, per_page)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13723 次 |
| 最近记录: |