【问题标题】:How to return multiple models/tables flask-sqlalchemy?如何返回多个模型/表flask-sqlalchemy?
【发布时间】:2014-09-21 20:30:02
【问题描述】:

我想从多个表中获取数据,所以我用 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()

但是当我尝试像这样使用分页时:

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

它给出了这个错误:

AttributeError: 'Query' object has no attribute 'paginate'

根据这个stackoverflow question

“查询”指的是 SQLAlchemy 查询,而 BaseQuery 指的是 Flask-SQLALchemy BaseQuery,后者恰好有 paginate() 函数。

如果我想使用 paginate() 函数,我必须像这样进行查询,

Employee.query.join()....paginate(...)

但这只会返回 Employee 模型中的数据列表,我也希望能够访问其他表/模型中的数据。

如何使用 Flask-Sqalchemy 查询多个表并从每个表或其中一些表中返回数据,以便我可以使用分页功能?

谢谢,

【问题讨论】:

  • 您能发布您的文件结构与多个模型的样子吗?它们在不同的文件中吗?

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

正如您提到的另一个 SO 问题中所述,您只能在 BaseQuery 对象上调用 paginate() 函数。

Employee.query.join()....paginate(...)

要访问其他表中的数据,请连接其他表并将所需的列传递给 add_columns() 函数。

Employee.query.join(Person).add_columns(Employee.id, Person.name).paginate(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    相关资源
    最近更新 更多