当前位置: 首页 > 面试题库 >

如何在Flask-SQLAlchemy中对db.session连接查询进行分页?

谭骏
2023-03-14
问题内容

我们有以下关系:

  • 一个人可以有许多电子邮件地址
  • 电子邮件服务提供商可以(显然)可以提供多个电子邮件地址
    因此,这是多对多的关系。我有三个表:电子邮件,提供者和用户。电子邮件具有两个外部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)


 类似资料:
  • 问题内容: 我在SQLAlchemy中找不到此简单查询的解决方案示例。SQLAlchemy可以替换T-SQL ETL数据吗? 我将此连接用于Windows身份验证: 问题答案: 您需要的是多部分架构名称。如果您使用的是声明式,则可以使用并使用它来执行查询。由于您省略了表或模型定义,因此我将根据您的查询示例生成示例:

  • 问题内容: 我正在使用flask和SQL Alchemy开发应用程序。我需要显示执行查询以生成页面的时间,以及每个查询用于调试的时间 最好的方法是什么? 问题答案: 如果你使用的是扩展名,并且不想打扰,可以设置配置密钥。

  • 问题内容: 我用来从表中获取数据。现在,从称为的表中获取所有记录正在按预期方式工作。 现在,我希望对多个列执行查询,如下所示: 但这给LIKE带来了错误。我怎样才能做到这一点? 问题答案: 请像运营商一样使用 http://docs.sqlalchemy.org/en/rel_0_9/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOpera

  • 你能帮我解决这个错误吗? 2017-08-05 18:54:18,421 INFOsqlalchemy.engine.base.Engine(4L,)2017-08-05 18:54:18,424 INFOsqlalchemy.engine.base.Engine COMMIT127.0.0.1--[05/Aug/2017 18:54:18]"GET/HTTP/1.1"200-127.0.0.1

  • 问题内容: 首先导入k和模块: 声明和对象: 有三个表:和。该Artist对象可以链接到多个。并且该Album对象可以链接到多个对象。的是保持之间的关系和紧密的: 所以我们有Artist链接到Album这是与Genre它看起来像这样:。 完成此设置后,我们Genre首先创建对象: 然后是两张专辑: 和艺术家: 创建数据库后,我们可以查询Albums链接到的内容Genre: 以及Artists链接到

  • 问题内容: 我正在使用Flask-SQLAlchemy从用户数据库中查询;但是,虽然 will return doing returns 我想知道是否有一种以不区分大小写的方式查询数据库的方法,以便第二个示例仍然返回 问题答案: 你可以使用过滤器中的或功能来完成此操作: 另一种选择是使用而不是进行搜索: