SQLAlchemy - 在关联表上使用order_by排序

21 投票
3 回答
21661 浏览
提问于 2025-04-16 21:51

我正在使用声明式的SQLAlchemy,并且有三个模型:Role(角色)、Permission(权限)和RolePermission(角色权限)。在我的Role模型中,我有以下内容:

class Role(Base):
    name = Column(u'NAME', VARCHAR(50), nullable=False, unique=True)
    permissionLinks = relationship(RolePermission, backref="role", order_by=name)
    permissions = relationship(Permission, backref=backref("roles",
      order_by=name), secondary=RolePermission.__table__,
      order_by=Permission.name)

现在,permissions的声明工作得很好,和角色相关的权限按我期望的方式(按名称)排序。但是,permissionLinks却出现了以下错误:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]多部分标识符 "ROLES.NAME" 无法绑定。 (4104) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]语句无法准备。 (8180)') u'SELECT [ROLES_PERMISSIONS].[ROLE_ID] AS [ROLES_PERMISSIONS_ROLE_ID], [ROLES_PERMISSIONS].[PERMISSION_ID] AS [ROLES_PERMISSIONS_PERMISSION_ID], [ROLES_PERMISSIONS].[IS_DENIED] AS [ROLES_PERMISSIONS_IS_DENIED] \nFROM [ROLES_PERMISSIONS] \nWHERE [ROLES_PERMISSIONS].[ROLE_ID] = ? ORDER BY [ROLES].[NAME]' (19,)

问题在于Role没有被连接,所以无法按Role.name进行排序。我尝试指定primaryjoin=id == RolePermission.id1,但似乎没有改变任何东西。我该如何在这个关系上指定一个连接,以便我可以按连接表中的一个字段(也就是Role.name)进行排序呢?

3 个回答

0

问题出在 permissionLinks 这个关系上。按照 Role.name 来排序这些项目对我来说没有意义。

8

你想要的是对RolePermission对象的角色属性进行排序。通过传递order_by,可以在Role类中设置排序。

试试这个:

from sqlalchemy.orm import backref

permissionLinks = relationship(RolePermission, backref=backref("role", order_by=name))

为反向引用设置一个顺序

37

我试了这些解决方案都没成功,不过我找到了一种更简单的方法。

from sqlalchemy.ext.declarative import declarative_base

class User(Base):
    # ....
    addresses = relationship("Address",
                         order_by="desc(Address.email)",
                         primaryjoin="Address.user_id==User.id")

可以在这里找到: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/relationships.html

撰写回答