SQLAlchemy - order_by для связи для таблицы соединений - PullRequest
13 голосов
/ 19 июля 2011

Я использую декларативную 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] [SQL Server] Не удалось связать многокомпонентный идентификатор «ROLES.NAME». (4104) (SQLExecDirectW); [42000] [Microsoft] [Драйвер ODBC SQL Server] [Оператор 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)?

Ответы [ 3 ]

22 голосов
/ 14 ноября 2012

Я не мог заставить ни одно из этих решений работать, однако я нашел более простой способ.

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

6 голосов
/ 28 октября 2011

То, что вы хотите, это заказать атрибуты роли объекта RolePermission. Передача order_by устанавливает порядок в классе Role.

Попробуйте это:

from sqlalchemy.orm import backref

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

установка порядка обратной ссылки

0 голосов
/ 21 июля 2011

Проблема в permissionLinks отношениях. Заказывать их по Role.name не имеет смысла для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...