如何在Django中执行SQL Server原生SQL语句并解决运行报错?
问题根源
你遇到的语法报错是因为Python会自动拼接相邻的字符串常量,而你拆分的每行SQL末尾没有预留空格,拼接后的完整SQL会出现关键字/标识符连写的情况,比如 SELECT *FROM、tableWHERE 这类无效语法,数据库无法识别。
修复方案
有两种常用的修复方式,推荐优先使用第二种,可读性更高也不容易出错:
方式1:给每行拆分的字符串末尾加空格
确保拼接后各部分语句有正确的空格分隔,同时保留SQL Server要求的方括号包裹库名/表名避免特殊字符问题:
from django.db import connection def fetch_matching_pn_products(): with connection.cursor() as cursor: cursor.execute("SELECT * " "FROM [db_name].[dbo].[table] " "WHERE name IN (" "SELECT name " "FROM [db_name].[dbo].[table] " "WHERE active = 1 " "GROUP BY name " "HAVING count(*) > 1 " ") " "ORDER BY name") data = cursor.fetchall() return data
方式2:使用三引号包裹多行SQL
直接和你本地可运行的原生SQL格式保持一致,不需要额外处理空格:
from django.db import connection def fetch_matching_pn_products(): with connection.cursor() as cursor: cursor.execute(""" SELECT * FROM [db_name].[dbo].[table] WHERE name IN ( SELECT name FROM [db_name].[dbo].[table] WHERE active = 1 GROUP BY name HAVING count(*) > 1 ) ORDER BY name """) data = cursor.fetchall() return data
验证技巧
如果后续再遇到类似语法报错,可以先把要执行的SQL语句赋值给一个变量,打印出来和本地可运行的原生语句对比,就能快速发现拼接错误。
内容的提问来源于stack exchange,提问作者David Louda
相关产品推荐
相关产品推荐

