SQLAlchemy-commande par sur la relation pour joindre la table

j'utilise SQLAlchemy déclarative et j'ai trois modèles: Role,Permission et RolePermission. Dans mon Role modèle, j'ai le code suivant:

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 déclaration fonctionne bien, et les permissions associées à un rôle sortent triées comme je m'y attends (par nom). Cependant, permissionLinks échoue avec l'erreur suivante:

sqlalchemy.exc.Programmererror: (Programmererror) ('42000', '[42000] [Microsoft] [Pilote de serveur SQL ODBC] [SQL Server]l'identificateur multi-parties " ROLES.Nom" ne pouvait pas être lié. (4104) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement (s) could not be prepared. (8180)') u'select [ROLES_PERMISSIONS].[ROLE_ID] COMME [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].[NOM'] (19,)

Le problème est que Role n'est pas joint, donc il ne peut pas trier par Role.name. J'ai essayé de spécifier primaryjoin=id == RolePermission.id1, mais cela n'a pas semblé changer quoi que ce soit. Comment puis-je spécifier une jointure sur cette relation de sorte que je puisse Trier par un champ dans une des tables jointes (à savoir, Role.name)?

11
demandé sur Sarah Vessels 2011-07-19 20:00:37

3 réponses

Je n'ai pu faire fonctionner aucune de ces solutions, mais j'ai trouvé un moyen plus facile.

from sqlalchemy.ext.declarative import declarative_base

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

Trouvé ici: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/relationships.html

19
répondu Nick Woodhams 2015-08-26 09:55:25

ce que vous voulez est d'Ordonner l'attribut de rôle de L'objet RolePermission. Passer l'order_by établit l'ordre dans la classe rôle.

essaye ceci:

from sqlalchemy.orm import backref

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

définir un ordre pour la référence arrière

6
répondu Brian 2011-10-28 18:24:32

le problème est dans Le permissionLinks relation. Commander ses articles par Role.name n'a pas de sens pour moi.

0
répondu Denis Otkidach 2011-07-21 09:44:50