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