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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:45:03