Многие ко многим запрос, используя flask_sqlalchemy - PullRequest
1 голос
/ 29 января 2020

Я получил эти модели в приложении на основе 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}
                   )

Заранее спасибо

1 Ответ

1 голос
/ 29 января 2020

Ниже приведен проверенный пример.
Обратите внимание, что из-за различных способов объединения этих таблиц вам потребуется явно указать объединения, как в примере ниже, чтобы 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...