在 ORM 查询中使用原始 SQL

Dan*_*anH 1 python sqlalchemy

是否可以使用您自己的原始 SQL 进行编辑或覆盖 ORM 生成的 SQL?或者 ORM 是否足够灵活,可以构建几乎任何我能想象到的查询?

具体来说,这是我试图进行的查询,也许通过 ORM 构建并不太难,尽管我看不到任何明显的构建路径。这是模型:

class AllocationStatus(Base):

    STATUS_RESERVED = 1
    STATUS_RELEASED = 2
    STATUS_CHOICES = (
        (STATUS_RESERVED, "Reserved"),
        (STATUS_RELEASED, "Released"),
    )

    __tablename__ = 'allocation_status'

    id = Column(Integer, primary_key=True)
    allocation_id = Column(Integer, ForeignKey('allocation.id'))
    allocation = relationship('Allocation')
    status = Column(Integer())
Run Code Online (Sandbox Code Playgroud)

这个想法是,对于给定的外键 ID allocation_id,我想知道 中的最新记录allocation_status

为了在原始 SQL 中实现这一点,我的目标是以下查询:

SELECT allocation_status.*
FROM allocation_status
LEFT JOIN allocation_status allocation_status2
    ON allocation_status.allocation_id = allocation_status2.allocation_id
    AND allocation_status.id < allocation_status2.id
WHERE allocation_status2.id IS NULL;
Run Code Online (Sandbox Code Playgroud)

Ilj*_*ilä 6

@Abdou 的答案是正确的方法,但您也可以使用以下命令运行文本 SQL Query.from_statement()

session.query(AllocationStatus).\
    from_statement(text("""
        SELECT allocation_status.*
        FROM allocation_status
        LEFT JOIN allocation_status allocation_status2
               ON allocation_status.allocation_id = allocation_status2.allocation_id
              AND allocation_status.id < allocation_status2.id
        WHERE allocation_status2.id IS NULL;""")).\
    all()
Run Code Online (Sandbox Code Playgroud)

注意使用text().