使用Django应用向SQL插入数据时遭遇COUNT字段错误或语法错误
问题原因及解决方法
直接错误原因
你写的SQL插入语句字符串拼接存在语法错误:saveDetails.Date前面缺少开头的单引号,导致生成的SQL语句格式混乱,字段数量与值的数量不匹配,触发了ODBC驱动的COUNT field incorrect or syntax error错误。
拼接后的错误SQL语句类似:
insert into [dbo].[testtable](Date,Questions,Result) values (01/01/2024','问题内容','结果');
可以看到第一个日期值没有开头的单引号,SQL解析时会判定字段和值的数量不对应。
临时修复(不推荐)
修正字符串拼接,给saveDetails.Date加上开头的单引号:
cursor.execute("insert into [dbo].[testtable](Date,Questions,Result) values ('"+saveDetails.Date+"','"+saveDetails.Questions+"','"+saveDetails.Result+"');")
正确且安全的做法:参数化查询
字符串拼接SQL存在SQL注入风险,且极易出现语法错误,应该使用参数化查询:
cursor.execute( "insert into [dbo].[testtable](Date, Questions, Result) values (?, ?, ?)", (saveDetails.Date, saveDetails.Questions, saveDetails.Result) )
用?作为占位符,pyodbc会自动处理参数的转义和格式,彻底避免语法错误与注入风险。
更符合Django规范的做法:使用ORM
既然你已经定义了ModelClass,完全不需要手动写数据库连接和原生SQL,直接用Django ORM的save()方法即可:
save_details = ModelClass() today_date = date.today() save_details.Date = today_date.strftime('%m/%d/%Y') save_details.Questions = question save_details.Result = str(result) save_details.save() # 调用save方法,Django自动处理所有数据库操作
这种方式无需手动管理连接,也规避了原生SQL的各类问题,是Django开发的标准流程。
内容的提问来源于stack exchange,提问作者Shubh kumar
相关产品推荐
相关产品推荐

