简体   繁体   English

使用flask_sqlalchemy的多对多查询

[英]Many to many query using flask_sqlalchemy

I got this models in a SQLAlchemy based app我在一个基于 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)
)

I want to join the 3 tables (using flask_sqlalchemy rather than a raw query) equivalent to:我想加入 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}
                   )

Thanks in advance提前致谢

Below is a tested example.下面是一个经过测试的例子。
Please note that due to the different ways these tables could be joined you will need to explicitly specify the joins, as in the example below, in order for SQLAlchemy to perform the query.请注意,由于这些表的连接方式不同,您需要显式指定连接,如下例所示,以便 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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM