You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django3.2.6保存Loan模型触发id字段不能为NULL错误如何解决?

问题根因

该报错的核心原因是SQL Server中Loan表的id主键列没有开启**IDENTITY(自增)**属性:Django写入数据时不会主动传入主键值,依赖数据库自增生成主键,数据库无自增配置就会尝试插入NULL值触发非空约束报错。即使去掉显式的id字段定义,Django默认生成的隐式主键依然要求数据库自增,因此问题不会消失。

排查步骤
  • 确认Django对接SQL Server的驱动版本:Django 3.2版本必须使用django-mssql-backend 2.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字段的定义中包含自增属性标识,排除迁移生成逻辑错误。
解决方法
  1. 安装适配驱动
    先卸载不兼容的旧驱动,安装匹配版本:
pip uninstall django-pyodbc-azure -y
pip install django-mssql-backend==2.8.1 pyodbc>=4.0.30
  1. 修正数据库配置
    在settings.py的数据库配置项中补充驱动配置,确保使用正确的ODBC驱动:
DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': '你的库名',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': '地址',
        'PORT': '端口',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
        },
    }
}
  1. 开发环境快速修复
    直接删除应用下所有历史迁移文件、删除数据库中的Loan表、删除django_migrations表中对应该应用的迁移记录,重新执行迁移即可:
python manage.py makemigrations
python manage.py migrate
  1. 生产环境热修复
    不需要删表,直接执行SQL给id列添加自增属性即可:
ALTER TABLE Loan ALTER COLUMN id BIGINT IDENTITY(1,1) PRIMARY KEY

内容的提问来源于stack exchange,提问作者lewis machilika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:15:02