python - 使用 flask_sqlalchemy 的多对多查询
问题描述
我在一个基于 SQLAlchemy 的应用程序中得到了这个模型
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(512))
status = db.Column(db.Enum(Status))
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(512))
user_tasks = db.relationship('Task',
secondary=user_tasks, lazy='subquery',
backref=db.backref('users', lazy=True)
)
user_tasks = db.Table('user_tasks',
db.Column('task_id', db.Integer, db.ForeignKey('task.id'), primary_key=True),
db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
db.Column('value', db.Integer)
)
我想加入 3 个表(使用flask_sqlalchemy
而不是原始查询)相当于:
db.session.execute(
'SELECT u.id, u.name, ut.value\
FROM user u\
JOIN user_tasks ut\
ON u.id = ut.user_id\
AND ut.task_id = :task_id\
JOIN task t\
ON t.id = ut.task_id',
{'task_id': task_id}
)
提前致谢
解决方案
下面是一个经过测试的例子。
请注意,由于这些表的连接方式不同,您需要显式指定连接,如下例所示,以便 SQLAlchemy 执行查询。
db.session.query(User.id,User.name,user_tasks.c.value).\
join(user_tasks,user_tasks.c.user_id==User.id).\
filter(user_tasks.task_id==task_id).\
join(Task,Task.id==user_tasks.c.task_id).all()
推荐阅读
- angular - PWA 不适用于 Angular 预渲染
- swiftui - SwiftUI - 总是左(前导)对齐导航栏项(前导:文本(“”))
- javascript - 如何在其余代码之前获得此异步结果?
- r - R脚本RDCOMClient无法打开xlsx文件
- r - 如何在ggplot2中指向一个历史?
- ios - 核心运动更新
- android - Android切换到多种布局
- vuejs3 - Vue 反应性:使用提供和注入创建反应性数据
- c++ - curl.lib 缺失(Visual Studio 2019,C++)
- php - 从注册到 Woocommerce Checkout 获取自定义字段