django进行数据库迁移的错误处理方法:You are trying to change the nullable field 'title' on book to non-nu

参考文档: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. 选择1 手动给出一个缺省值,在生成 bookstore/migrations/000x_auto_xxxxxxxx_xxxx.py 文件时自动将输入的值添加到default参数中
      2. 暂时忽略,以后用其它的命令处理缺省值问题(不推荐)
      3. 退出当前生成迁移文件的过程,自己去修改models.py, 新增加一个default=XXX 的缺省值(推荐使用)
  • 数据库的迁移文件混乱的解决办法

    1. 删除 所有 migrations 里所有的 000?_XXXX.py (__init__.py除外)
    2. 删除 数据库
      • sql> drop database mywebdb;
    3. 重新创建 数据库
      • sql> create datebase mywebdb default charset…;
    4. 重新生成migrations里所有的 000?_XXXX.py
      • python3 manage.py makemigrations
    5. 重新更新数据库
      • python3 manage.py migrate

 

 

---

上一篇:Non-static method ‘*‘ cannot be referenced from a static context (在静态上下文中不能引用非静态方法)


下一篇:C++默默编写并调用哪些函数