cj *_*ero 3 python sqlalchemy flask flask-sqlalchemy
我想从多个表中获取数据,所以我用 sqlalchemy 做到了这一点:
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
a = db.aliased(Employee, name='Employee')
b = db.aliased(Person, name='Person')
c = db.aliased(PositionFulfillment, name='PositionFulfillment')
d = db.aliased(Position, name='Position')
e = db.aliased(PositionType, name='PositionType')
f = db.aliased(Party, name='Party')
data = db.session.query(a, b, e, f) \
.join(b, a.entity_id == b.entity_id) \
.join(c, a.entity_id == c.party_id) \
.join(d, c.position_id == d.id) \
.join(e, d.position_type_id == e.id) \
.join(f, d.party_id == f.id) \
.all()
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用这样的分页时:
page = request.args.get('page', 1, type=int)
count = request.args.get('count', 10, type=int)
a = db.aliased(Employee, name='Employee')
b = db.aliased(Person, name='Person')
c = db.aliased(PositionFulfillment, name='PositionFulfillment')
d = db.aliased(Position, name='Position')
e = db.aliased(PositionType, name='PositionType')
f = db.aliased(Party, name='Party')
pagination = db.session.query(a, b, e, f) \
.join(b, a.entity_id == b.entity_id) \
.join(c, a.entity_id == c.party_id) \
.join(d, c.position_id == d.id) \
.join(e, d.position_type_id == e.id) \
.join(f, d.party_id == f.id) \
.paginate(page, per_page=count, error_out=False)
data = pagination.items
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误:
AttributeError: 'Query' object has no attribute 'paginate'
Run Code Online (Sandbox Code Playgroud)
根据这个stackoverflow问题
引用 SQLAlchemy 查询的“查询”和引用 Flask-SQLALchemy BaseQuery 的 BaseQuery 之间存在差异,后者恰好具有 paginate() 函数。
如果我想使用 paginate() 函数,我必须像这样进行查询,
Employee.query.join()....paginate(...)
Run Code Online (Sandbox Code Playgroud)
但这只会返回 Employee 模型中的数据列表,我也希望能够访问其他表/模型中的数据。
如何使用 Flask-Sqalchemy 查询多个表并从每个表或其中一些表返回数据,以便我可以使用分页功能?
谢谢,
如您提到的其他 SO 问题所述,您只能在 BaseQuery 对象上调用 paginate() 函数。
Employee.query.join()....paginate(...)
Run Code Online (Sandbox Code Playgroud)
要访问其他表中的数据,请连接其他表并将所需的列传递给 add_columns() 函数。
Employee.query.join(Person).add_columns(Employee.id, Person.name).paginate(...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2967 次 |
| 最近记录: |