一、执行python manage.py makemigrations app时报错:“You are trying to add a non-nullable field 'name' to contact without a default; we can't do that (the database needs something to populate existing rows)"
原因:
新添加不允许为null、且没有设置defaul的字段时报错。
合理,数据库内存量记录需要默认值填充该字段。
解决方法:
在Django项目app应用下的model.py里,为各个字段设置default。
二、执行python manage.py migrate时告警:“MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode”。
原因:
数据库的strict模式没有启用。
解决方法:
可以修改数据库配置文件。
也可以无需修改数据库配置文件,在Django项目下的settings.py中添加如下配置项:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxxx',
'HOST': 'xxxx',
'PORT': xxxx,
'USER': 'xxxx',
'PASSWORD': 'xxxxxxxx',
'OPTIONS': {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
}
}
}
三、使用Django ORM,在应用下的model.py中为字段设置了default。但在执行迁移命令后,生成的数据库表内default未生效:执行describe 表名称查看到Default都为NULL,且执行show create table 表名称发现创建表结构时并未设置default。
原因:
Django的默认值是在框架层面:就是说使用该框架编程来执行insert操作时,是可以生效,自动设置默认值的。
但在数据库层面不行:执行Django迁移命令创建表结构时,并不会在数据库层面设置default。即如果用sql语句或其他框架来执行insert操作,不会自动设置默认值。
解决方法:
当项目仅使用Django ORM框架操作数据库,没有问题。
如果需要使用sql语句添加记录,需要自己填写该字段值,哪怕Django里已设置过默认值。
四、为什么数据库设置的NULL为NO,但在insert时不插入该字段也可以成功?
原因:
概念理解问题:not null不等于不可以插入空值(空字符串等)。not null 指的是不可以将该字段值设置为NULL,但是可以插入空值。
空字符串("")虽然表示“没有值”,但这个值是已知的。NULL 表示 “未知值”,这个值是未知的。
数据库中 SQL 语句该如何处理 NULL 值,你真的了解过吗?
解决方法:
不涉及。