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

从Django视图向SQL Server表插入数据报错无效列名的语法问题求助

问题修正方案

报错根本原因

  • 你直接把Python变量名写在了SQL语句字符串中,SQL Server会将这些变量名识别为数据库字段名,你的业务表中不存在这些字段,因此触发Invalid column name报错。
  • INSERT语句语法错误:不能混合使用VALUES子句和SELECT子句作为插入数据源。

修正代码

方案1:已提前获取到userid值,直接插入

如果你代码中已经提前拿到了正确的userid、first_name、last_name变量值,直接用参数化查询插入即可:

def add_view(request):
    if request.method == "POST":
        val1 = float(request.POST['num1'])
        val2 = float(request.POST['num2'])
        result = val1 + val2      
        # 此处可保留你原有打印调试逻辑
        with connection.cursor() as cursor:
            # %s为SQL Server参数占位符,变量统一通过第二个参数传入
            cursor.execute(
                "INSERT INTO datatable (userid, num1, num2, result) VALUES (%s, %s, %s, %s)",
                (userid, val1, val2, result)
            )
    return render(request, 'addnum/home.html')

方案2:需要通过姓名查询userid再插入

如果你需要从userstable查询对应姓名的userid再插入数据,使用INSERT ... SELECT语法,把固定值放到SELECT的返回列中:

def add_view(request):
    if request.method == "POST":
        val1 = float(request.POST['num1'])
        val2 = float(request.POST['num2'])
        result = val1 + val2      
        # 此处可保留你原有打印调试逻辑
        with connection.cursor() as cursor:
            cursor.execute(
                "INSERT INTO datatable (userid, num1, num2, result) SELECT userid, %s, %s, %s FROM userstable WHERE first_name = %s AND last_name = %s",
                (val1, val2, result, first_name, last_name)
            )
    return render(request, 'addnum/home.html')

注意事项

  • 不要将Python变量直接拼接到SQL字符串中,全部通过cursor.execute的第二个参数传入,既可以解决字段识别错误的问题,也能避免SQL注入风险。
  • 占位符的顺序要和后方元组的变量顺序一一对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:06:04