python - 如何在 Flask-SQLAlchemy 中为 db.session 连接查询分页?

标签 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()

这工作正常(它返回一个 4 元组 (Provider, user_id, provider_id, email_address),所有我想要的信息),但我后来发现这不是 使用 Flask BaseQuery 类,因此 Flask-SQLAlchemy 提供的 pagination 不起作用。显然 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)

修改自第 376 行附近的 paginate 函数:https://github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy.py

关于python - 如何在 Flask-SQLAlchemy 中为 db.session 连接查询分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727155/

相关文章:

java - Python IO 错误 : too many open files

javascript - Django 从模板写入上下文

python - sqlalchemy 寻找字符串形式的服务器版本,而不是类似字节的对象

python - Connexion Python框架设置多进程

sockets - socket.gaierror : [Errno 8] nodename nor servname provided,或在 flask 应用程序中未知

python - 将字符串作为参数传递会添加转义字符

python - Sqlalchemy : association table for many-to-many relationship between template_id and department. 如何删除关系?

python - sqlalchemy 全外连接

python - Flask - 如何按类型检索输入的值?

Pythonic 参数传递