[英]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.