Django中无法向无Identity字段的MS SQL Server表插入数据
问题原因及解决方法
这个问题不是ODBC驱动适配问题,核心是Django的SQL Server后端默认主键策略导致的:它默认假设模型主键对应数据库的Identity自增字段,插入时会尝试执行SET IDENTITY_INSERT相关操作,而你的表没有Identity属性,因此触发报错。
具体解决步骤
- 修正模型定义:将主键字段从默认的
AutoField改为IntegerField,明确指定primary_key=True,同时映射到数据库的ID字段:
from django.db import models class BaseTest(models.Model): id = models.IntegerField(primary_key=True, db_column='ID') name = models.CharField(max_length=100, db_column='name') class Meta: db_table = 'base_test'
- 手动指定ID插入:因为表没有自动生成ID的机制,插入数据时必须显式提供ID值:
BaseTest.objects.create(id=1, name="测试数据")
- 后端配置检查:如果使用
django-mssql-backend或django-pyodbc-azure作为SQL Server后端,确保数据库配置中没有强制开启Identity相关的自动处理(多数情况下默认配置即可,只要模型定义正确)。
验证方式
修改模型后,重新生成迁移文件(如果需要)并执行,再尝试插入带ID的记录,即可正常写入数据。
内容的提问来源于stack exchange,提问作者Federico
相关产品推荐
相关产品推荐

