您的位置:首页 > 编程语言 > Go语言

Django2.0-db(11)-ORM模型迁移

2018-11-11 12:01 363 查看

笔记在知了课堂-Django开发的基础上更改

ORM模型迁移

迁移命令:

  1. makemigrations
    :将模型生成迁移脚本。模型所在的
    app
    ,必须放在
    settings.py
    中的
    INSTALLED_APPS

    中。这个命令有以下几个常用选项:

      [app_label]
      :后面可以跟一个或者多个
      app
      ,那么就只会针对这几个app生成迁移脚本。如果没有任何的app_label,那么会检查
      INSTALLED_APPS
      中所有的app下的模型,针对每一个app都生成响应的迁移脚本。
    • [--name]
      :给这个迁移脚本指定一个名字(就是在
      migrations
      文件夹里的名字)
    • [ --empty]
      :生成一个空的迁移脚本。如果你想写自己的迁移脚本,可以使用这个命令来实现一个空的文件,然后自己再在文件中写迁移脚本。
  2. migrate
    :将新生成的迁移脚本。映射到数据库中。创建新的表或者修改表的结构。Django会生成一个记录migrationname文件的依赖表(
    django_migrations
    )

    ),在执行migrate的时候会根据该表和文件依赖关系进行迁移(表里有的不会再生成)以下一些常用的选项:

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

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

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

会将代码种的迁移脚本和数据库中

django_migrations
中的迁移脚进行对比,如果发现数据库中没有这个迁移脚本(
django_migrations
表),那么就会执行这个迁移脚本。

migrate做了什么

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

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

  1. 找到哪里不一致,然后使用
    python manage.py --fake [版本名字]
    ,将这个版本标记为已经映射。
  2. 删除指定
    app
    migrations
    和数据库表
    django_migrations
    中和这个
    app
    相关的版本号,然后将模型中的字段和数据库中的字段保持一致,再使用命令
    python manage.py makemigrations
    重新生成一个初始化的迁移脚本,之后再使用命令
    python manage.py makemigrations --fake-initial
    来将这个初始化的迁移脚本标记为已经映射。以后再修改就没有问题了。

更多关于迁移脚本的。请查看官方文档:https://docs.djangoproject.com/en/2.0/topics/migrations/

另外一个笔记版本

原因

执行migrate命令会报错的原因是:数据库中的

django_migrations
表中的迁移版本记录和代码种的迁移脚本不一致导致的。

解决方法

使用
[--fake]
参数

首先对比数据库中的迁移脚本和代码中的迁移脚本。然后找到哪个不同,之后再使用

--fake
,将代码种的迁移脚本信息添加到
django_migrations
表中,但是不会执行sql语句。这样就可以避免每次执行
migrate
的时候,都执行一些重复的迁移脚本。

最后解决方案

如果代码中的迁移脚本和数据库中的迁移脚本实在太多,无法搞清楚使用。

  1. 原理: 将之前的哪些迁移脚本剔除,重新来过。将出问题的app下的所有模型和数据库中表保持一致,来重新映射。
  2. 将出问题的app下所有模型,和数据库中的表保持一致。
  3. 将出问题的app下的所有迁移脚本文件都删掉。在数据库中的
    django_migration
    表中将出问题的app相关的迁移记录都删除掉。
  4. 使用
    makemigrations
    ,重新将模型生成一个迁移脚本。
  5. 使用
    mirate --fake-initial
    参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型对应的表已经在数据库中存在,无需重新映射)
  6. 完成。可以执行其他的映射了、
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: