¿Cómo lograr la unión interna utilizando SQLAlchemy?

¿Cómo lograr la unión interna utilizando SQLAlchemy? Estoy tratando de hacer chat simple

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 "" % (self.type) 

Quiero leer todos los mensajes más jóvenes que alguna fecha y, en consecuencia, tener una lista de diccionarios como

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

y para eso necesito una unión interior. ¿Cómo hacer que esto funcione?

Related of "¿Cómo lograr la unión interna utilizando SQLAlchemy?"

Para eso primero necesitas tener una session para hacer una Query . Además, puede ser conveniente tener una relationship en su MessageModel.

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

Esto creará la relación en ambos modelos.

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

Puede haber formas más elegantes de acceder a su estructura de datos, pero esta debería funcionar.