2012-11-27 12 views
5

SQLAlchemy का उपयोग करके आंतरिक शामिल कैसे प्राप्त करें? मैं सरल चैट करने के लिएएसक्यूएलकेमी का उपयोग करके आंतरिक शामिल कैसे प्राप्त करें?

class Base(object): 
    def __tablename__(self): 
     return self.__name__.lower() 

    id = Column(Integer, primary_key=True) 

Base = declarative_base(cls=Base) 

class PlayerModel(Base): 
    __tablename__ = 'players' 
    username = Column(String(30), nullable=False) 
    email = Column(String(75), nullable=False) 
    password = Column(String(128), nullable=False) 

class MessageModel(Base): 
    __tablename__ = 'messages' 
    player_id = Column(Integer,ForeignKey('chats.id'), nullable=False) 
    message = Column(String(2000), nullable=False) 
    time = Column(TIMESTAMP, server_default=func.now()) 

    def __repr__(self): 
     return "<Message('%s')>" % (self.type) 

मैं सभी संदेशों को कुछ तारीख से कम आयु में पढ़ना चाहते हैं कोशिश कर रहा हूँ और परिणाम में शब्दकोशों की सूची के लिए की तरह

[{'username':'x','message':'y','time':'number0'},{'username':'y','message':'z','time':'number1'}, 
{'username':'x','message':'zz','time':'number'}] 

और उस के लिए मैं आंतरिक में शामिल होने की जरूरत है। इसे काम करने के लिए कैसे करें?

उत्तर

7

इसके लिए आपको Query बनाने के लिए पहले session होना चाहिए। इसके अतिरिक्त यह आपके संदेश मॉडल पर relationship रखने के लिए सुविधाजनक हो सकता है।

class MessageModel(Base): 
    __tablename__ = 'messages' 
    player_id = Column(Integer,ForeignKey('chats.id'), nullable=False) 
    message = Column(String(2000), nullable=False) 
    time = Column(TIMESTAMP, server_default=func.now()) 
    player = relationship(PlayerModel, backref="messages") 

यह दोनों मॉडलों पर संबंध बनाएगा।

results = (session.query(PlayerModel) 
        .join(PlayerModel.messages) 
        .values(PlayerModel.username, 
          MessageModel.message, 
          MessageModel.time)) 
# results will be a generator object 

# This seems a bit convoluted, but here you go. 
resultlist = [] 
for username, message, time in results: 
    resultlist.append({'message': message, 
         'username': username, 
         'time': time}) 

आपके डेटा संरचना में आने के लिए और अधिक शानदार तरीके हो सकते हैं लेकिन इसे काम करना चाहिए।

+0

यह * आंतरिक * शामिल नहीं होता है, यह सिर्फ एक जॉइन बनाता है, जो आमतौर पर बाएं बाहरी जुड़ने के लिए डिफ़ॉल्ट होता है। –

+0

(बाएं) बाहरी जॉइन 'outerjoin' विधि के साथ बनाए जाते हैं। –

+0

@ डैनियल-वैन-फ्लाईमेन [एसक्यूएलकेमी दस्तावेज 'जॉइन' विधि पर देखें] (http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join) सन्दर्भ के लिए। यदि आप 'isouter' कीवर्ड पैरामीटर का उपयोग करते हैं तो जॉइन एक बाहरी जॉइन होगा। यह एक "आंतरिक" शामिल होने के लिए डिफ़ॉल्ट है। –

संबंधित मुद्दे