You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django ORM无法执行自身生成的原生查询问题求助

Django搭配PostgreSQL时ORM生成的原生查询执行报错问题

我用Django搭配PostgreSQL数据库,执行以下代码:

SomeClass.objects.filter(text__regex=rf"searchkeyword")
the_query = str(SomeClass.query)

变量the_query的内容为:

SELECT * FROM "SomeClass" WHERE "SomeClass"."text"::text ~ searchkeyword

但使用SomeClass.objects.raw(query)执行该查询时,出现错误:

Exception Value:    
column "usa" does not exist
... WHERE "SomeClass"."text"::text ~* searchkeyword

本质上Django ORM无法执行自身生成的原生查询,求解决思路。

第一次编辑:即使是如下简单查询,也会出现相同错误:

SomeClass.objects.filter(text="searchkeyword")

报错信息:

column "searchkeyword" does not exist
LINE 1: SELECT * FROM SomeClass WHERE text = searchkeyword

第二次编辑:本问题与“打印带引号的Django QuerySet SQL”类问题不同,我的场景中即使保留双引号,问题仍然存在。


解决思路

  • 核心原因:参数未绑定:Django ORM生成的SQL里的searchkeyword是参数占位符,并非直接的字符串值。直接用str(query)拿到的SQL执行时,PostgreSQL会把它当成列名,而非查询参数,这才触发了“列不存在”的错误。
  • 正确执行方式:
    1. 不要直接拼接SQL字符串,用raw()的参数传递功能:
      keyword = "searchkeyword"
      results = SomeClass.objects.raw('SELECT * FROM "SomeClass" WHERE "SomeClass"."text"::text ~ %s', [keyword])
      
    2. 如果是基于ORM生成的QuerySet,直接调用queryset.all()/queryset.get()即可,完全没必要转成原生SQL再用raw()执行。
  • 查看完整带参数的SQL:若要确认实际执行的SQL,可开启DEBUG=True后通过connection.queries查看:
    from django.db import connection
    
    # 触发查询执行
    queryset = SomeClass.objects.filter(text__regex=rf"searchkeyword")
    queryset.exists()
    # 打印最后一条查询的SQL和参数
    print(connection.queries[-1]['sql'])
    print(connection.queries[-1]['params'])
    

内容的提问来源于stack exchange,提问作者Mehrdad Salimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:45:19