Django3.2.6保存Loan模型触发id字段不能为NULL错误如何解决?
问题根因
该报错的核心原因是SQL Server中Loan表的id主键列没有开启**IDENTITY(自增)**属性:Django写入数据时不会主动传入主键值,依赖数据库自增生成主键,数据库无自增配置就会尝试插入NULL值触发非空约束报错。即使去掉显式的id字段定义,Django默认生成的隐式主键依然要求数据库自增,因此问题不会消失。
排查步骤
- 确认Django对接SQL Server的驱动版本:Django 3.2版本必须使用
django-mssql-backend2.8.1及以上版本,老旧的django-pyodbc-azure等驱动不兼容Django 3.2的BigAutoField逻辑,会导致迁移时不给主键列加IDENTITY属性。 - 直接查询表结构确认自增配置:执行SQL语句
SELECT is_identity FROM sys.columns WHERE object_id = OBJECT_ID('Loan') AND name = 'id',返回0即可确认id列未开启自增。 - 检查迁移文件:打开应用
migrations目录下生成Loan表的对应迁移文件,确认id字段的定义中包含自增属性标识,排除迁移生成逻辑错误。
解决方法
- 安装适配驱动
先卸载不兼容的旧驱动,安装匹配版本:
pip uninstall django-pyodbc-azure -y pip install django-mssql-backend==2.8.1 pyodbc>=4.0.30
- 修正数据库配置
在settings.py的数据库配置项中补充驱动配置,确保使用正确的ODBC驱动:
DATABASES = { 'default': { 'ENGINE': 'sql_server.pyodbc', 'NAME': '你的库名', 'USER': '用户名', 'PASSWORD': '密码', 'HOST': '地址', 'PORT': '端口', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', }, } }
- 开发环境快速修复
直接删除应用下所有历史迁移文件、删除数据库中的Loan表、删除django_migrations表中对应该应用的迁移记录,重新执行迁移即可:
python manage.py makemigrations python manage.py migrate
- 生产环境热修复
不需要删表,直接执行SQL给id列添加自增属性即可:
ALTER TABLE Loan ALTER COLUMN id BIGINT IDENTITY(1,1) PRIMARY KEY
内容的提问来源于stack exchange,提问作者lewis machilika
相关产品推荐
相关产品推荐

