从 SQLalchemy Flask 中的连接表返回填充字段

Posted

技术标签:

【中文标题】从 SQLalchemy Flask 中的连接表返回填充字段【英文标题】:return populated fields from a join table in SQLalchemy Flask 【发布时间】:2022-01-24 04:17:47 【问题描述】:

UserService 是连接用户表和服务表的连接表。我有一个查询,它将所有具有 user_id = 的表返回到路由中传递的 id。

@bp.route('/user/<id>/services', methods=['GET'])
def get_services_from_user(id):
    user = db_session.query(User).filter(id == User.id).first()

    if not user:
        return jsonify('Message': f'User with id: id does not exist', 'Status': 404)

    user_services = db_session.query(UserService).filter(user.id == UserService.user_id).all()
    result = user_services_schema.dump(user_services)

    for service in result:
        user_service = db_session.query(Service).filter(service['service_id'] == Service.id).all()
        result = services_schema.dump(user_service)
        return jsonify(result)

result 包含一个如下所示的列表:

[
    
        "id": 1,
        "service_id": 1,
        "user_id": 1
    ,
    
        "id": 2,
        "service_id": 2,
        "user_id": 1
    
]

我怎样才能继续这个查询或添加另一个查询来获取所有实际填充的服务(服务类),而不仅仅是 service_id 并将它们全部返回到一个列表中? for 循环是我的尝试,但目前失败了。我只返回一个包含一个填充服务的列表,而不是第二个。

【问题讨论】:

【参考方案1】:

你可以试试这样的:

userServies = db_session.query(Users, Services).filter(Users.id == Services.id).all()

userServices 将是一个可迭代的。你应该使用: for value, index in userServices: 遍历它。 (可能是index, value我不是 100% 确定订单)

还有另一种方法使用.join() 并使用.add_columns() 添加您需要的列。 还有另一种使用方式

db_session.query(Users.id, Services.id, ... 'all the columns that you need' ...).filter(Users.id == Services.id).all()

【讨论】:

以上是关于从 SQLalchemy Flask 中的连接表返回填充字段的主要内容,如果未能解决你的问题,请参考以下文章

Flask-SQLAlchemy 左外连接过滤查询

如何防止 Flask-SQLAlchemy 中的 SQL 注入?有没有更好的方法从 CSV 加载数据?

在添加Flask,SQLAlchemy之前检查表中的行中的值是不是已经存在

使用Flask SQLAlchemy从SQLite切换到MySQL

Flask 学习-12.Flask-SQLAlchemy 连接 mysql 数据库

Flask-SQLAlchemy:在回滚无效事务之前无法重新连接