【问题标题】:How to achieve inner join using SQLAlchemy?如何使用 SQLAlchemy 实现内连接?
【发布时间】:2012-11-15 02:02:09
【问题描述】:

如何使用 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'}]

为此,我需要内部连接。如何使它工作?

【问题讨论】:

    标签: python python-2.7 sqlalchemy


    【解决方案1】:

    为此,您首先需要有一个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})
    

    可能有更优雅的方式来处理您的数据结构,但这个应该可以工作。

    【讨论】:

    • 这不会创建 inner 连接,它只是创建一个连接,通常默认为左外连接。
    • (左)外连接是使用outerjoin 方法创建的。
    • @daniel-van-flymen 请参阅SQLAlchemy documentation on the join method 以供参考。如果您使用 isouter 关键字参数,则 JOIN 将是 OUTER JOIN。它默认为“内部”连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多