【发布时间】: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