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会把它当成列名,而非查询参数,这才触发了“列不存在”的错误。 - 正确执行方式:
- 不要直接拼接SQL字符串,用
raw()的参数传递功能:keyword = "searchkeyword" results = SomeClass.objects.raw('SELECT * FROM "SomeClass" WHERE "SomeClass"."text"::text ~ %s', [keyword]) - 如果是基于ORM生成的QuerySet,直接调用
queryset.all()/queryset.get()即可,完全没必要转成原生SQL再用raw()执行。
- 不要直接拼接SQL字符串,用
- 查看完整带参数的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
相关产品推荐
相关产品推荐

