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

如何从Django ORM查询中提取可直接执行的原生SQL语句?

从Django ORM提取可直接执行的SQL(SQL Server环境)

方法1:QuerySet属性+手动替换参数

Django的QuerySet自带query属性,能返回带占位符的SQL语句,结合query.params拿到参数值后直接替换,就能生成可执行的SQL:

qs = ModelA.objects.filter(name='abc')
# 获取带占位符的SQL模板
sql_template = str(qs.query)
# 获取对应参数
params = qs.query.params
# 替换占位符生成最终SQL
final_sql = sql_template % params

输出结果就是可直接复制到DBeaver的SELECT * FROM "ModelA" WHERE "ModelA"."name" = 'abc',多参数场景下params会以元组形式返回,%操作符会自动对应替换。

方法2:借助pyodbc cursor渲染参数

利用django的数据库连接和pyodbc的cursor,让驱动帮你完成参数绑定和SQL渲染:

from django.db import connection

qs = ModelA.objects.filter(name='abc')
sql_template = str(qs.query)
params = qs.query.params

with connection.cursor() as cursor:
    cursor.execute(sql_template, params)
    # 部分pyodbc版本支持直接获取已渲染参数的SQL语句
    final_sql = cursor.statement

注意:若你的pyodbc版本不支持cursor.statement属性,直接用方法1即可。

方法3:断点调试时的快速操作

在断点调试的控制台里,直接执行以下代码就能拿到结果:

qs = ModelA.objects.filter(name='abc')
final_sql = str(qs.query) % qs.query.params
print(final_sql)

复制输出内容就能在数据库工具里直接执行。

额外提示

  • SQL Server支持用方括号包裹表/字段名,若Django生成的SQL带双引号,可手动替换为[ModelA]格式
  • 参数中的特殊字符(如单引号)会被自动转义,无需手动处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:32:40