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”参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重新执行了。)
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    sicp-py
    Ubuntu下找不到ttyUSB*问题解决
    Mysql基本命令及数据库存储位置
    open-vm-tools与VMware Tools
    64位ubuntu安装交叉编译工具链,显示找不到命令
    VMware Tools 继续运行脚本未能在虚拟机中成功运行。
    VMware Workstation 14安装VMware Tools
    VMware Workstation14 安装Ubuntu18.04
    Linux安装Sqlite
    mysql中文乱码
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12275743.html
Copyright © 2011-2022 走看看