Django操作MSSQL时IDENTITY_INSERT报错原因咨询
问题场景
执行以下Django代码操作外部MSSQL数据库时:
SORequestFromEmail.objects.create(subject='test')
触发报错:
django.db.utils.IntegrityError: ('23000', "[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot insert explicit value for identity column in table 'tblSORequestFromEmail' when IDENTITY_INSERT is set to OFF. (544) (SQLExecDirectW)")
对应的模型定义:
class SORequestFromEmail(models.Model): id = models.IntegerField(primary_key=True, db_column='ID') fromemail = models.TextField(db_column='FromEmail', blank=True) fromname = models.TextField(db_column='FromName', blank=True) subject = models.TextField(db_column='Subject', blank=True) description = models.TextField(db_column='TextDescription', blank=True) cc = models.TextField(db_column='CC', blank=True) datetimereceived = models.DateTimeField(db_column='DateTimeReceived') class Meta: db_table = u'tblSORequestFromEmail'
报错原因
字段定义与数据库特性不匹配:
数据库中tblSORequestFromEmail表的ID列是MSSQL的自增IDENTITY列,但模型里将id定义为普通的IntegerField(primary_key=True),没有告知Django这是自增字段。Django主键默认行为触发数据库限制:
Django创建对象时,会自动为主键字段生成默认值(如0)并尝试插入。而MSSQL的IDENTITY列在IDENTITY_INSERT关闭的默认状态下,不允许显式插入任何值(哪怕是Django自动生成的默认值),因此触发完整性约束错误。额外潜在问题:
模型中的datetimereceived字段未设置null=True或默认值,且创建对象时未传入该值,后续即使解决ID问题,也会触发新的非空字段报错。
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

