SQLAlchemy - 在关联表上使用order_by排序
我正在使用声明式的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 个回答
问题出在 permissionLinks
这个关系上。按照 Role.name
来排序这些项目对我来说没有意义。
你想要的是对RolePermission对象的角色属性进行排序。通过传递order_by,可以在Role类中设置排序。
试试这个:
from sqlalchemy.orm import backref
permissionLinks = relationship(RolePermission, backref=backref("role", order_by=name))
为反向引用设置一个顺序
我试了这些解决方案都没成功,不过我找到了一种更简单的方法。
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