从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
相关产品推荐
相关产品推荐

