SQLAlchemy - 连接表的关系上的 order_by

Posted

技术标签:

【中文标题】SQLAlchemy - 连接表的关系上的 order_by【英文标题】:SQLAlchemy - order_by on relationship for join table 【发布时间】:2011-07-19 16:00:37 【问题描述】:

我正在使用声明性 SQLAlchemy,我有三个模型:RolePermissionRolePermission。在我的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] = ?按 [角色] 排序。[名称]' (19,)

问题是Role 没有被加入,所以它不能按Role.name 排序。我尝试指定primaryjoin=id == RolePermission.id1,但这似乎并没有改变任何东西。如何指定此关系的联接,以便我可以按联接表之一(即Role.name)中的字段排序?

【问题讨论】:

【参考方案1】:

我无法使这些解决方案中的任何一个起作用,但是我找到了一种更简单的方法。

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

【讨论】:

哈哈!遇到这个问题并找到了答案!你是唯一有效的!【参考方案2】:

您想要的是订购 RolePermission 对象的角色属性。传递 order_by 设置 Role 类中的顺序。

试试这个:

from sqlalchemy.orm import backref

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

设置反向引用的顺序

【讨论】:

【参考方案3】:

问题出在permissionLinks 关系中。通过Role.name 订购商品对我来说毫无意义。

【讨论】:

我想显示与给定权限关联的所有RolePermission 行,并且我希望它们按Role.name 的顺序显示。目前我在从数据库中获取结果后对它们进行排序,但似乎我应该能够使用 SQLAlchemy 做到这一点。我显示RolePermission 行,而不仅仅是Permission 行(通过permissions),因为RolePermission 具有Permission 没有的有关创建日期、创建者等的信息。 但在您的示例代码中,您尝试对与给定 role 关联的 RolePermission 对象进行排序。 对。看起来这应该是可行的,因为每个RolePermission 都有一个Role,那么为什么我不能按Role 上的属性对RolePermissions 进行排序呢?

以上是关于SQLAlchemy - 连接表的关系上的 order_by的主要内容,如果未能解决你的问题,请参考以下文章

Flask 和 SQLalchemy NoForeignKeysError:无法确定关系 User.posts 上的父/子表之间的连接条件 [关闭]

ORM SQLAlchemy 表于表的关系

SQLAlchemy - 从自动加载表的内部连接映射列的子集

SQLAlchemy(三):外键连表关系

SQLAlchemy 连接来自同一个表的多个列

sqlalchemy:与多个表的非平凡的一对一关系