2012-03-25 11 views
19

मॉडल

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) 

यह काम नहीं करता सर्च कर रहे हैं .... मैं हर जगह खोज की है और प्रलेखन पढ़ा है। लेकिन मुझे नहीं लगता कि मैं अपने (स्वामी) क्वेरी को उनके 'स्वामी' रिश्ते के नाम पर कैसे क्रमबद्ध कर सकता हूं।SQLAlchemy: रिश्ते के क्षेत्र पर क्वेरी परिणाम (order_by) कैसे ऑर्डर करें?

यह हमेशा परिणाम:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name' 

यह आसान होना चाहिए ... लेकिन मैं यह नहीं दिख रहा। कंप्रेटर में भी देखा, जो तार्किक लग रहा था, लेकिन मुझे नहीं पता कि ORDER BY के लिए क्वेरी भाग उत्पन्न होता है या मुझे वापस लौटना चाहिए क्योंकि सबकुछ गतिशील रूप से उत्पन्न होता है। और एक साधारण चीज़ करने के लिए मेरे प्रत्येक 'खिलाड़ी' संबंधों के लिए एक तुलनित्र बनाना जटिल लगता है।

उत्तर

30

SQLAlchemy चाहता है कि आप SQL के संदर्भ में सोचें। यदि आप "बेस" के लिए कोई प्रश्न करते हैं, तो यह है:

SELECT * FROM base 

आसान। तो, कैसे, एसक्यूएल में, क्या आप "बेस" से पंक्तियों का चयन करेंगे और "नाम" कॉलम द्वारा पूरी तरह से अलग तालिका में ऑर्डर करेंगे, यानी "प्लेयर"? तुम एक में शामिल होने का उपयोग करें:

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

SQLAlchemy आप समान विचार प्रक्रिया का उपयोग किया है - आप में शामिल होने के():

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

समझ में आता है कि। लेकिन इसका मतलब यह है कि मैं एक समय में केवल एक खिलाड़ी रिश्ते में शामिल हो सकता हूं? अधिक में शामिल होना (जो भी कारण ..) का अर्थ तोड़ना सामान है। तो अगर मैं अपडेटर से ऑर्डर करने के लिए चाहते हैं, तो मैं यह करने के लिए है: session.query(Base).join(Base.updater).order_by(Player.name) या 'ठेकेदार': session.query (आधार) .join (Base.occupier) .order_by (Player.name) –

+2

आप कर सकते हैं उस तालिका के उपनामों का उपयोग करके किसी भी समय एक निश्चित तालिका में शामिल हों। फिर यह एक एसक्यूएल अवधारणा है, इसलिए एसक्यूएल में समस्या को हल करने का तरीका जानना है कि आप जानते हैं कि एसक्यूएलकेमी में इसे कैसे हल किया जाए। एलिसिंग को पहली बार http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#using-aliases पर पेश किया गया है। – zzzeek

+0

यह उत्तर किसी भी 'बेस' ऑब्जेक्ट्स को फ़िल्टर करेगा जहां 'base.ownerid' शून्य है। क्या आप जानते हैं कि संबंध मूल्यों के अनुसार दृष्टिकोण को संशोधित करने के तरीके, लेकिन उन वस्तुओं को बहिष्कृत नहीं करें जिनके संबंध में कोई मूल्य नहीं है? (शायद पिछले या पहले रिश्ते के बिना लोगों को ऑर्डर करना) – melchoir55