Pao*_*aJ. 6 python sqlalchemy python-2.7
如何使用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)
Run Code Online (Sandbox Code Playgroud)
我想阅读所有比某个日期更年轻的消息,并在结果中列出像这样的词典
[{'username':'x','message':'y','time':'number0'},{'username':'y','message':'z','time':'number1'},
{'username':'x','message':'zz','time':'number'}]
Run Code Online (Sandbox Code Playgroud)
为此我需要内部联接.如何使这个工作?
为此,你首先session要做一个Query.另外,relationship在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")
Run Code Online (Sandbox Code Playgroud)
这将在两个模型上创建关系.
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})
Run Code Online (Sandbox Code Playgroud)
可能有更优雅的方式来到您的数据结构,但这个方法应该工作.