繁体   English   中英

SQLAlchemy 连接关联表

[英]SQLAlchemy join with association tables

在使用 SQLAlchemy 的 Flask 应用程序中,我有用户和资产表。 用户属于零到多个组,并且对每个资产的访问被允许归零到这些组中的几个。 这些关系用关联表建模(基本结构如下所示)。 我可以查询数据库和关联表按预期工作。

我正在努力的部分是,给定一个用户,检索允许该用户访问的资产。 我了解我需要加入群组。

在 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() (在我的代码中,我引用了这个对象)。

基本的数据库定义如下:

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)

这似乎可以完成这项工作:

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

但我不得不说,我发现很难掌握 Flask-sqlalchemy 在幕后提供的胶水(以及在没有的情况下)。

暂无
暂无

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

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