【问题标题】:SQLAlchemy cursor approach with pagination带有分页的 SQLAlchemy 游标方法
【发布时间】:2021-12-01 06:22:11
【问题描述】:

我使用 SQLAlchemy 作为我的 MySql 后端数据库的 ORM。我有 2 个表需要连接在一起,但这些表分别有超过 55 万条记录。我加入他们并使用以下代码进行分页 -

result = session.query(Table1.Col1, Table1.Col2, Table1.Col3, ...
                       Table2.Col1, Table2.Col2, Table2.Col3, ...
                .select_from(join(Table1, Table2, (Table1.Col1== Table2.Col1)
                              & (Table1.Col2== Table2.Col2))) \
                .filter(Table1.someCol == some_value) \
                .order_by(Table1.Col2.asc())

# code for pagination - This allows me to use paginate function of Flask-SqlAlchemy from a SQLAlchemy query object 
# by directly passing in result object above
def paginate(query, page, per_page=20, error_out=True):
    query.__class__ = BaseQuery
    return query.paginate(page, per_page, error_out)

然后,最后我使用 render_template 并传入分页对象来渲染 html 内容。

这里的问题是这种方法速度慢且占用大量内存。此处的连接查询将整个结果集带入内存,然后对其进行分页。此外,Flask-SQLAlchemy 的底层分页使用了 limit 和 offset,这对于大型数据集来说会变得很慢。

为了解决这个问题,我可以使用基于光标的分页方法,但我无法找到一个基于光标的解决方案,它以块的形式迭代连接的结果集,并且还可以与 flask 的 render_template 一起用于在前端渲染内容。

有人遇到过这个问题吗?

【问题讨论】:

    标签: python mysql sqlalchemy pagination flask-sqlalchemy


    【解决方案1】:
    table1:  INDEX(someCol, col2)
    table2:  INDEX(col1, col2)
    

    如需进一步讨论,请提供SHOW CREATE TABLE 和为SELECT 生成的SQL。

    分页:“记住你离开的地方,而不是使用慢得多的OFFSET

    【讨论】:

    • 生成的SQL查询是指flask生成的原始sql连接查询吗?
    • @ashwanikumar - 是的。它可能以SELECT 开头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2011-09-11
    • 2016-10-27
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多