Django 1.8 - migrate 和 makemigrations 有啥区别?

Posted

技术标签:

【中文标题】Django 1.8 - migrate 和 makemigrations 有啥区别?【英文标题】:Django 1.8 - what's the difference between migrate and makemigrations?Django 1.8 - migrate 和 makemigrations 有什么区别? 【发布时间】:2015-07-10 21:24:44 【问题描述】:

根据此处的文档: https://docs.djangoproject.com/en/1.8/topics/migrations/ 它说:

migrate, which is responsible for applying migrations, as well as unapplying and listing their status.

makemigrations, which is responsible for creating new migrations based on the changes you have made to your models.

据我所知,我先做

makemigrations

创建迁移文件然后做

migrate

实际应用迁移?

请注意,我刚刚开始我的 Django 项目,并将我的应用程序添加到我的“已安装应用程序”列表中。之后,我做到了

python manage.py runserver

它说

You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them.

它没有提到任何关于运行 makemigrations 的内容。

【问题讨论】:

django 框架需要一些数据库表 - 例如:会话、content_type、已经为其创建迁移的站点。您看到的消息是这些“默认”迁移尚未应用。因此,您将在第一次启动服务器之前运行 migrate @karthikr 哦,好吧。所以在我的情况下,由于我甚至在执行初始“迁移”之前就将我的应用程序添加到了“installed_apps”,这是否意味着我现在应该先运行“makemigration”然后再执行“迁移”? 是的。那是为您的应用程序创建迁移的时间。下一步是应用这些创建的迁移 【参考方案1】:

Make migrations : 基本上它为预安装的应用程序和您在已安装应用程序中添加的新创建的应用程序模型生成 SQL 命令。它不会在您的数据库中执行 SQL 命令。所以实际的表不是在 DB 中创建的。

Migrate : Migrate 执行数据库文件中 make-migration 生成的那些 SQL 命令。所以迁移后所有已安装应用的表都在数据库中创建。

【讨论】:

【参考方案2】:

根据second tutorial of the django tutorial series。迁移是:

The migrate command takes all the migrations that haven’t been applied (Django tracks which ones are applied using a special table in your database called django_migrations) and runs them against your database - essentially, synchronizing the changes you made to your models with the schema in the database.

它所做的几乎就是:

    执行 make migrations 命令时,会将“指令”保存到 mysql 当您执行 migrate 命令时,您正在执行相同的指令

【讨论】:

【参考方案3】:

需要同时运行这两个命令才能完成数据库表的迁移,以与您的模型同步。

makemigrations 简单地分析您当前的模型是否存在与您的数据库不同步的任何更改,并创建一个可用于同步的迁移文件。如果此时离开,您的模型仍将与您的数据库不同步,可能会破坏您查询数据库的代码。

migrate 是“Make It So!”的命令并应用在makemigrations 阶段记录的更改。

Source

【讨论】:

【参考方案4】:

makemigrations:创建迁移(生成 SQL 命令-尚未执行)

migrate:运行迁移(执行 SQL 命令)

但在您的情况下,Django 要求您迁移应该在首次运行服务器之前运行的默认迁移。即使没有创建第一个应用程序,也会出现同样的警告。

【讨论】:

【参考方案5】:

众所周知,Django 是一个ORM(对象关系映射)。当我们使用命令时:

python manage.py makemigrations [app_name]

它将生成 sql 命令来创建与您在 models.py 文件中创建的每个类对应的表。 然后是命令:

python manage.py migrate [app_name]

将使用 makemigrations 生成的命令在数据库中创建表。

例如,如果我们制作一个模型类-

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

使用makemigrations后对应的sql命令会是

CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);

使用上面的命令,当我们使用 migrate 时,会在数据库中创建表。

【讨论】:

【参考方案6】:

正如 Django 的 documentation 所说,迁移是 Django 将您对模型所做的更改(添加字段、删除模型等)传播到数据库架构中的方式。

makemigrations 基本上为预安装的应用程序(可以在 settings.py 中的已安装应用程序中查看)和您添加的新创建应用程序的模型生成 SQL 命令已安装的应用程序。它不会在您的数据库文件中执行这些命令。因此在 makemigrations 之后不会创建表。

应用 makemigrations 后,您可以使用 sqlmigrate 查看那些 SQL 命令,其中显示了 makemigrations 生成的所有 SQL 命令。

migrate 在数据库文件中执行这些 SQL 命令。因此,在执行 migrate 后,您已安装应用程序的所有表都会在您的数据库文件中创建。

您可以通过安装sqlite browser 并打开 db.sqlite3 来实现这一点,您可以在执行 migrate 命令后看到所有表都出现在数据库文件中。

【讨论】:

【参考方案7】:

根据Polls tutorial:

    python manage.py makemigrations <app>:创建迁移(生成SQL 命令)。

    python manage.py migrate:运行迁移(执行SQL 命令)。

【讨论】:

【参考方案8】:

您应该在 settings.py 文件的 INSTALLED APPS 部分下添加新应用程序后运行命令 -migrate- 以便将数据库状态与您当前的模型集同步。假设您已经修改了 models.py 文件。

当您运行 -makemigrations- 时,它会将对模型的更改打包到单独的迁移文件中。

通常您会先运行 makemigrations,然后再进行迁移。

See documentation on Django Models

【讨论】:

【参考方案9】:

这是 django 替代了旧的手动南迁移方式,它们可用于对模型中的更改进行编目并写出将在 db 中发生的更改。

Migrate 基本上是旧的 syncdb,但它考虑了 makemigrations 进行的所有迁移。

【讨论】:

以上是关于Django 1.8 - migrate 和 makemigrations 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决Django 1.8在migrate时失败

如何解决Django 1.8在migrate时失败

如何解决Django 1.8在migrate时失败

Django 1.8 迁移、自定义用户模型和 Postgres/MySQL 的奇怪问题

Django 1.8 迁移:django_content_type 不存在

No migrations to apply. django同步数据库失败