2012-11-27 2 views
5

SQLAlchemy를 사용하여 내부 조인을 달성하는 방법은 무엇입니까? 나는 간단한 채팅을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

이 경우 먼저 session이 있어야 Query이됩니다. 또한 MessageModel에 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

@ daniel-van-flymen [join' 메서드에 대한 SQLAlchemy 문서] (http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join)를 참조하십시오. 참조를 위해. 'isouter' 키워드 매개 변수를 사용하면 JOIN은 OUTER JOIN이됩니다. 기본값은 "내부"조인입니다. –

관련 문제