Rob*_*ell 38 python api-design sqlalchemy
我正在使用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
Run Code Online (Sandbox Code Playgroud)
当我尝试使用它时,我得到了例外:
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.
Run Code Online (Sandbox Code Playgroud)
pyd*_*ner 39
尝试添加第一个必需参数,该参数必须是一组查询过滤器.从而,
# 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
Run Code Online (Sandbox Code Playgroud)
要么,
# 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
Run Code Online (Sandbox Code Playgroud)
小智 6
在提出这个问题时不是一个选项,从版本 1.0.0 开始,您可以利用Query事件来确保在编译对象之前、在函数的用户执行任何操作之后始终调用方法:limitoffsetqueryq
from sqlalchemy.event import listen
def q(page=0, page_size=None):
query = session.query()
listen(query, 'before_compile', apply_limit(page, page_size), retval=True)
return query
def apply_limit(page, page_size):
def wrapped(query):
if page_size:
query = query.limit(page_size)
if page:
query = query.offset(page * page_size)
return query
return wrapped
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37300 次 |
| 最近记录: |