这是密码
with Role.get_session() as session:
query = session.query(User, UserGroup, UserToUserGroup, UserGroupToRole, Role)\
.filter(User.user_id == UserToUserGroup.columns.user_id)\
.filter(UserToUserGroup.columns.user_group_id == UserGroup.user_group_id)\
.filter(UserToUserGroup.columns.user_group_id == UserGroupToRole.columns.user_group_id)\
.filter(UserGroupToRole.columns.role_id == Role.role_id)\
.filter(User.user_id == user_id)
current_app.logger.error(str(query))
res = query.all()
简而言之,这个查询是超级..坏,在所有的意义上,据我所知。
UserGroupToRole = Table("UserGroupsToRoles", base.metadata,
Column("user_group_id", INTEGER(unsigned=True), ForeignKey("UserGroups.user_group_id")),
Column("role_id", INTEGER(unsigned=True), ForeignKey("Roles.role_id")))
UserToUserGroup = Table("UsersToUserGroups", base.metadata,
Column("user_id", INTEGER(unsigned=True), ForeignKey("Users.user_id")),
Column("user_group_id", INTEGER(unsigned=True), ForeignKey("UserGroups.user_group_id")))
其他三个模型是非常标准的。User
通过UserToUserGroup
透视表与UserGroup
有1:many
关系。UserGroup
通过UserGroupToRole
透视表与Role
有1:many
关系。
在这些模型上定义的所有关系都是lazy="joined"
**问题:**如何高效地将一个用户(根据提供的用户id)Map到所有关联的Roles
?对于给定的user_id
,我只想返回Role
示例
我意识到这将返回User
和Role
示例之间的所有数据(包括查询未指定的其他关系,因为即使是那些关系也是lazy=joined),这是不可取的。
1条答案
按热度按时间1l5u6lss1#
使用joins应该可以简化查询,它也可能更有效,但我无法证明这个Assert: