2012-11-27 42 views
5

Làm thế nào để đạt được tham gia bên trong bằng cách sử dụng SQLAlchemy? Tôi cố gắng để làm cho đơn giản trò chuyệnLàm thế nào để đạt được tham gia bên trong bằng cách sử dụng 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) 

Tôi muốn đọc tất cả các thư trẻ hơn một số ngày và trong kết quả để có danh sách các từ điển như

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

và cho rằng tôi cần bên tham gia. Làm thế nào để làm cho điều này để làm việc?

Trả lời

7

Để làm điều đó trước tiên, bạn cần có session để tạo Query. Ngoài ra, có thể thuận tiện để có một relationship trên MessageModel của bạn.

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

Điều này sẽ tạo mối quan hệ trên cả hai mô hình.

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

Có thể có nhiều cách thanh lịch hơn để truy cập cấu trúc dữ liệu của bạn nhưng cách này sẽ hiệu quả.

+0

Điều này không tạo ra một * bên trong * tham gia, nó chỉ tạo ra một tham gia, mà thường mặc định để bên ngoài tham gia bên ngoài. –

+0

(Trái) các kết nối bên ngoài được tạo bằng phương thức 'outerjoin'. –

+0

@ daniel-van-flymen Xem [tài liệu SQLAlchemy về phương thức 'join'] (http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join) để tham khảo. Nếu bạn sử dụng tham số từ khóa 'isouter' thì JOIN sẽ là một OUTER JOIN. Nó mặc định là tham gia "bên trong". –

Các vấn đề liên quan