python-3.x 如何最有效地使用SQLAlchemy ORM查询1:many:many关系?

f3temu5u  于 2023-04-08  发布在  Python
关注(0)|答案(1)|浏览(140)

这是密码

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透视表与UserGroup1:many关系。UserGroup通过UserGroupToRole透视表与Role1:many关系。
在这些模型上定义的所有关系都是lazy="joined"

**问题:**如何高效地将一个用户(根据提供的用户id)Map到所有关联的Roles?对于给定的user_id,我只想返回Role示例

我意识到这将返回UserRole示例之间的所有数据(包括查询未指定的其他关系,因为即使是那些关系也是lazy=joined),这是不可取的。

1l5u6lss

1l5u6lss1#

使用joins应该可以简化查询,它也可能更有效,但我无法证明这个Assert:

with Role.get_session() as session:
    roles = session.query(Role)\
        .join(UserGroupToRole)\
        .join(UserGroup)\
        .join(UserToUserGroup)\
        .join(User)\
        .filter(User.user_id == user_id)\
        .all()

相关问题