参考文档:https://blog.csdn.net/liuxingxing_star/article/details/103995856
数据库迁移的错误处理方法
-
当执行
$ python3 manage.py makemigrations
出现如下迁移错误时的处理方法-
错误信息
$ python3 manage.py makemigrations You are trying to change the nullable field 'title' on book to non-nullable without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration) 3) Quit, and let me add a default in models.py Select an option:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
翻译为中文如下:
$ python3 manage.py makemigrations 您试图将图书上的可空字段“title”更改为非空字段(没有默认值);我们不能这样做(数据库需要填充现有行)。 请选择修复: 1)现在提供一次性默认值(将对所有现有行设置此列的空值) 2)暂时忽略,让我自己处理空值的现有行(例如,因为您在以前的数据迁移中添加了RunPython或RunSQL操作来处理空值) 3)退出,让我在models.py中添加一个默认值 选择一个选项:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
错误原因
- 当将如下代码
class Book(models.Model): title = models.CharField("书名", max_length=50, null=True)
- 1
- 2
- 去掉 null=True 改为如下内容时会出现上述错误
class Book(models.Model): title = models.CharField("书名", max_length=50)
- 1
- 2
- 原理是 此数据库的title 字段由原来的可以为NULL改为非NULL状态,意味着原来这个字段可以不填值,现在改为必须填定一个值,那填什么值呢?此时必须添加一个缺省值。
-
处理方法:
- 选择1 手动给出一个缺省值,在生成 bookstore/migrations/000x_auto_xxxxxxxx_xxxx.py 文件时自动将输入的值添加到default参数中
- 暂时忽略,以后用其它的命令处理缺省值问题(不推荐)
- 退出当前生成迁移文件的过程,自己去修改models.py, 新增加一个
default=XXX
的缺省值(推荐使用)
-
-
数据库的迁移文件混乱的解决办法
- 删除 所有 migrations 里所有的 000?_XXXX.py (
__init__.py
除外) - 删除 数据库
- sql> drop database mywebdb;
- 重新创建 数据库
- sql> create datebase mywebdb default charset…;
- 重新生成migrations里所有的 000?_XXXX.py
- python3 manage.py makemigrations
- 重新更新数据库
- python3 manage.py migrate
- 删除 所有 migrations 里所有的 000?_XXXX.py (
---