98.ORM迁移详解,makemigrations,migrate

Posted guyan-2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了98.ORM迁移详解,makemigrations,migrate相关的知识,希望对你有一定的参考价值。

ORM模型迁移

迁移命令:

1、makemigrations:将模型生成迁移脚本。模型所在的app,必须放在settings.py中的INSTALLED_APPS中,这个命令有以下几个常用的选项:

  • app_label : 后面可以跟一个或者是多个app,那么就只会针对这几个app生成迁移脚本,如果没有任何的app_label,那么会检查INSTALLED_APPS中所有的app下的模型,针对每一个app都生成相应的迁移脚本。
  • --name : 给这个迁移脚本指定一个名字。
  • --empty : 生成一个空的迁移脚本文件,可以使用这个命令来实现一个空的文件,然后自己在文件中写迁移脚本。

    2.migrate:将生成的迁移脚本。映射到数据库中。创建新的表或者修改表的结构,以下是一些常用的选项:

  • app_label : 将某个app的迁移脚本映射到数据库中,如果没有指定,那么会将在所有的安装在INSTALLED_APPS中的app都映射到数据库中。
  • app_label migrationsname : 将某个app下指定的名字的migration文件映射到数据库中。
  • --fake : 可以将指定的迁移脚本名字添加到数据库中,但是并不会把迁移脚本转换为sql语句,修改数据库中的表。
  • --fake-initial : 将第一次生成的迁移文件版本号记录在数据库中,但并不会真正的执行迁移脚本。

    migrate怎么判断哪些迁移脚本需要执行:

  • 会将代码中的迁移脚本与数据库中的“django_migrations”中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。

    migrate做了什么事情:

  • [1] 将相关的迁移脚本翻译成sql语句,在数据库中执行这个sql语句。
  • [2]如果这个sql语句执行没有问题,就会将这个迁移脚本的名字记录到“django_migrations”中。

    3. showmigrations : 查看某个app下的迁移文件。如果后面没有app,那么将会查看INSTALLED_APPS中所有的迁移文件。

    4.sqlmigrate :查看某个迁移文件在映射到数据库中的时候,转换的sql语句。

    migrations中的迁移脚本和数据库中的迁移脚本对不上怎么办?

    解决办法:

    1. 使用 --fake参数:

    首先对比数据库中的迁移脚本和代码中的迁移脚本,然后找到不同的迁移脚本文件,之后在使用“--fake” ,将代码中的迁移脚本添加到“django_migrations”中,但是并不会执行sql语句。这样就可以避免每次执行“migrate”中,但是并不会执行sql语句,这样就可以避免每次执行“migrate”的时候,都执行一些重复的迁移脚本。
终极解决方案:如果代码中的迁移脚本和数据库中的迁移脚本

实在是太多了,就是搞不清,那么这时候就可以使用终极解决方案:

  • [1]终极解决方案原理:就是将之前的那些迁移脚本都不用了。重新来过。要将出问题的app下的所有模型和数据库表中保持一致,重新映射。
  • [2]将出问题的app下的所有模型,都和数据库中的表保持一致。
  • [3]将出问题的app下的所有迁移脚本文件都删除掉。再在
    “django_migrations”表中将出问题的app相关的迁移记录都删掉。
  • [4]使用“makemigrations”,重新将模型生成一个迁移脚本。
  • [5]使用“migrate --fake-initial”参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重新执行了。)

以上是关于98.ORM迁移详解,makemigrations,migrate的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.7 - makemigrations 为非托管模型创建迁移

Django - 迁移命令说该表在执行第二次 makemigrations 后存在

django makemigrations 和 heroku 服务器上的迁移不创建表

在创建新类 Airport 并在 makemigrations 引发 IntegrityError 后迁移它时对航班进行一些更改之后

Django之ContentType详解

makemigrations 忽略所有领域 (DJANGO)