from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey
from sqlalchemy import Integer
from sqlalchemy import Unicode
from sqlalchemy import TIMESTAMP
from sqlalchemy.orm import relationship
BaseModel = declarative_base()
class Base(BaseModel):
__tablename__ = 'base'
id = Column(Integer, primary_key=True)
location = Column(Unicode(12), ForeignKey("locationterrain.location"), unique=True,)
name = Column(Unicode(45))
ownerid = Column(Integer,ForeignKey("player.id"))
occupierid = Column(Integer, ForeignKey("player.id"))
submitid = Column(Integer,ForeignKey("player.id"))
updateid = Column(Integer,ForeignKey("player.id"))
owner = relationship("Player",
primaryjoin='Base.ownerid==Player.id',
join_depth=3,
lazy='joined')
occupier= relationship("Player",
primaryjoin='Base.occupierid==Player.id',
join_depth=3,
lazy='joined')
submitter = relationship("Player",
primaryjoin='Base.submitid== Player.id',
join_depth=3,
lazy='joined')
updater= relationship("Player",
primaryjoin='Base.updateid== Player.id',
join_depth=3,
lazy='joined')
class Player(BaseModel):
__tablename__ = 'player'
id = Column(Integer, ForeignKey("guildmember.playerid"), primary_key=True)
name = Column(Unicode(45))
bases = dbsession.query(Base)
bases = bases.order_by(Base.owner.name)
Cela ne fonctionne pas .... J'ai cherché partout et j'ai lu la documentation. Mais je ne vois tout simplement pas comment trier ma requête (Base) sur le nom de leur relation de "propriétaire".
Il en résulte toujours:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name'
Ça doit être facile ... mais je ne le vois pas. J'ai également examiné les comparateurs, ce qui semblait logique, mais je ne vois pas où la partie de requête pour ORDER BY est générée ou ce que je devrais retourner car tout est généré dynamiquement. Et faire un comparateur pour chacune de mes relations de "joueur" pour faire une chose simple semble trop compliqué.
SQLAlchemy veut que vous pensiez en termes de SQL. Si vous faites une requête pour "Base", c'est:
SELECT * FROM base
facile. Alors, comment, dans SQL, sélectionneriez-vous les lignes de "base" et les classeriez-vous par la colonne "nom" dans une table totalement différente, c'est-à-dire "joueur"? Vous utilisez une jointure:
SELECT base.* FROM base JOIN player ON base.ownerid=player.id ORDER BY player.name
SQLAlchemy vous fait utiliser le même processus de réflexion - vous rejoignez ():
session.query(Base).join(Base.owner).order_by(Player.name)