2012-03-25 16 views
19

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.

risposta

30

SQLAlchemy vuole che tu pensi in termini di SQL. Se si esegue una query per "Base", ovvero:

SELECT * FROM base 

facile. Quindi, in SQL, dovresti selezionare le righe da "base" e ordinare dalla colonna "nome" in una tabella completamente diversa, cioè "giocatore"? Si utilizza un join:

SELECT base.* FROM base JOIN player ON base.ownerid=player.id ORDER BY player.name 

SQLAlchemy ha si utilizza il processo di pensiero identico - si uniscono():

session.query(Base).join(Base.owner).order_by(Player.name) 
+0

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) –

+2

è 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

+0

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

Problemi correlati