python - 将 LIMIT 和 OFFSET 应用于 SQLAlchemy 中的所有查询

标签 python sqlalchemy api-design

我正在使用 SQLAlchemy(查询 MySQL)设计一个 API,我想强制我的所有查询都具有 page_size (LIMIT) 和 page_number (OFFSET) 参数。

有没有用 SQLAlchemy 做到这一点的干净方法?也许建立某种工厂来创建自定义 Query 对象?或者也许有一个使用 mixin 类的好方法?

我尝试了明显的方法,但没有成功,因为必须在应用所有过滤条件后调用 .limit() 和 .offset():

def q(page=0, page_size=None):
    q = session.query(...)
    if page_size: q = q.limit(page_size)
    if page: q = q.offset(page*page_size)
    return q

当我尝试使用它时,我得到了异常:

sqlalchemy.exc.InvalidRequestError: Query.filter() being called on a Query which already has LIMIT or OFFSET applied. To modify the row-limited results of a  Query, call from_self() first.  Otherwise, call filter() before limit() or offset() are applied.

最佳答案

尝试添加第一个必需参数,该参数必须是一组查询过滤器。因此,

# q({'id': 5}, 2, 50)
def q(filters, page=0, page_size=None):
    query = session.query(...).filter_by(**filters)
    if page_size:
        query = query.limit(page_size)
    if page: 
        query = query.offset(page*page_size)
    return query

或者,

# q(Model.id == 5, 2, 50)
def q(filter, page=0, page_size=None):
    query = session.query(...).filter(filter)
    if page_size:
        query = query.limit(page_size)
    if page: 
        query = query.offset(page*page_size)
    return query

关于python - 将 LIMIT 和 OFFSET 应用于 SQLAlchemy 中的所有查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258934/

相关文章:

python - 使用 Python 显示图像

python - 我们如何使用 SQL-esque "LIKE"标准连接两个 Spark SQL 数据帧?

python - 插入中的 sqlalchemy 回滚

javascript - 如何异步运行 Docker 命令?

python - 如何从 curl 获取 session ID 并在下一个 GET 请求中再次使用它

python - 最新版本的 yowsup 的文档在哪里?

python - Flask-SQLAlchemy 查询多对多

python - 如何在 Flask-SQLAlchemy 模型上映射 db.Enum 模型的 WTForms 字段?

json - 在 JSON 中格式化货币值的标准是什么?

c - 如何将 Go 绑定(bind)建模为使用 union 的 C 结构?