zoukankan      html  css  js  c++  java
  • 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”参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重新执行了。)
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    面向对象方法的重载(overloading)和覆盖(overriding)。
    注意:在对象变量中存放的是引用(地址);在简单变量中存放的是数值。
    类方法中的一类特殊方法:构造方法。
    在用面向对象思想开发的过程中,可以复用对象就进行复用,如无法进行复用则开发新的对象。
    对于对象的要求:高内聚、低耦合,这样容易拼装成为一个系统。
    为什么要使用面向对象:
    什么是对象:EVERYTHING IS OBJECT(万物皆对象)
    Java如何在指定端口创建套接字?
    Java如何查找系统的代理设置?
    Java如何检查端口是否被使用?
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12275743.html
Copyright © 2011-2022 走看看