簡體   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