modelle
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))
Ricerca
bases = dbsession.query(Base)
bases = bases.order_by(Base.owner.name)
Questo non funziona .... Ho cercato dappertutto e leggere la documentazione. Ma non vedo come posso ordinare la mia query (Base) sul nome della relazione 'proprietario'.SQLAlchemy: come ordinare i risultati della query (order_by) nel campo di una relazione?
risulta sempre:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name'
Questo deve essere facile ... ma io non lo vedo. Ho anche esaminato Comparators, che sembrava logico, ma non vedo dove viene generata la parte di query per ORDER BY o cosa dovrei restituire poiché tutto viene generato dinamicamente. E fare un comparatore per ciascuna delle mie relazioni "giocatore" per fare una cosa semplice sembra complicato.
questo ha un senso. Ma questo significa che posso unirmi a una delle relazioni giocatore alla volta, giusto? Unirsi di più (per qualsiasi ragione ..) significa rompere cose. Quindi, se voglio ordinare da updater, devo fare questo:
session.query(Base).join(Base.updater).order_by(Player.name)
o 'occupante': session.query (Base) .join (Base.occupier) .order_by (Player.name) –è possibile unirsi a una certa tabella qualsiasi numero di volte usando alias di quella tabella. ancora una volta questo è un concetto SQL, quindi sapere come risolvere il problema in SQL significa che sapresti come risolverlo in SQLAlchemy. L'aliasing è inizialmente introdotto su http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#using-aliases. – zzzeek
Questa risposta escluderebbe qualsiasi oggetto 'base' dove' base.ownerid' è nullo. Sai come modificare l'approccio all'ordine in base ai valori delle relazioni, ma non escludere oggetti che non hanno valori nella relazione? (magari ordinando quelli senza la relazione precedente o precedente) – melchoir55