SQLAlchemy объединяет с таблицами ассоциаций - PullRequest
0 голосов
/ 05 февраля 2020

В приложении Flask, которое использует SQLAlchemy, у меня есть таблицы для пользователей и ресурсов. Пользователи принадлежат к нулю нескольким группам, и доступ к каждому активу разрешен к нулю нескольким из этих групп. Эти отношения моделируются с помощью ассоциативных таблиц (структура basi c показана ниже). Я могу запросить базу данных, и таблицы сопоставлений работают так, как задумано.

Часть, в которой я борюсь, заключается в том, чтобы, учитывая пользователя, получить ресурсы, к которым этому пользователю разрешен доступ. Я понимаю, что мне нужно вступать в группы.

В SQL следующее утверждение дает нужный мне результат:

select * from user as u 
  join association_user_group as aug on u.id == aug.user_id 
  join association_asset_group as aag on aag.group_id = aug.group_id
  where username='some_name'; 

Однако я не могу понять, как перевести это в Flask -SQLAlchemy, используя его преимущества (которые мне нравятся во многих контекстах).

Для простоты, давайте предположим, что рассматриваемый пользователь User.query.first() (в моем коде у меня есть ссылка на этот объект).

базисное c определение базы данных выглядит следующим образом:

association_user_group = db.Table(
    'association_user_group',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('group_id', db.Integer, db.ForeignKey('group.id'))
)

association_asset_group = db.Table(
    'association_asset_group',
    db.Column('asset_id', db.Integer, db.ForeignKey('asset.id')),
    db.Column('group_id', db.Integer, db.ForeignKey('group.id'))
)

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    ...

class Asset(db.Model):
    __tablename__ = 'asset'
    id = db.Column(db.Integer, primary_key=True)
    ...

class Group(db.Model):
    __tablename__ = 'group'
    id = db.Column(db.Integer, primary_key=True)
    ...

    users = db.relationship(
        'User',
        secondary=association_user_group,
        backref=db.backref('groups', lazy='dynamic'))
    asset = db.relationship(
        'Asset',
        secondary=association_asset_group,
        backref=db.backref('groups', lazy='dynamic'))

Обновление : Тем временем работает следующий вид, но он не использует определенные db.relationship s на уроках, что кажется позором:

db.session.query(association_asset_group) \
          .join(association_user_group,
                association_user_group.c.group_id
                == association_asset_group.c.group_id) \
          .filter(association_user_group.c.user_id == u.id)

1 Ответ

0 голосов
/ 05 февраля 2020

Это похоже на работу:

q = db.session.query(Asset) \
              .join(Group, User.groups) \
              .join(Asset, Group.assets) \
              .filter(User.id == u.id) \
              .distinct() 

Но я должен сказать, что мне трудно растереть asp клей, который flask -кальхимия обеспечивает под капотом (и когда нет ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...