Skip to main content
 首页 » 编程设计

python之在 ORM 查询中使用原始 SQL

2025年05月04日14freeliver54

是否可以使用您自己的原始 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()) 

想法是,对于 allocation_id 的给定外键 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; 

请您参考如下方法:

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

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

注意 text() 的使用.