Django 1.8 - migrate和makemigrations有什么区别?

66
根据这里的文档: https://docs.djangoproject.com/en/1.8/topics/migrations/ 上说:
引用: “migrate”负责应用迁移,以及取消应用和列出迁移状态。

引用: “makemigrations”负责根据您对模型所做的更改创建新的迁移。
据我所了解,首先我要做的是
makemigrations

创建迁移文件,然后执行。
migrate

要实际应用迁移吗?

请注意,我刚刚开始我的Django项目,并将我的应用程序添加到我的INSTALLED_APPS列表中。之后,我进行了

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的内容。

5
Django框架需要一些数据库表,例如:session、content_type、site,它已经为此创建了迁移。你看到的信息是这些“默认”的迁移尚未应用。因此,在首次启动服务器之前,您需要运行migrate命令。 - karthikr
@karthikr 噢,好的。那么根据我的情况,既然我在进行初始“迁移”之前就将我的应用程序添加到“installed_apps”,这是否意味着我现在应该先运行“makemigration”,然后再执行“migrate”? - SilentDev
1
是的,这就是为你的应用程序创建迁移时机。下一步是应用这些已创建的迁移。 - karthikr
9个回答

91
根据 投票教程
  1. python manage.py makemigrations <app>:生成迁移(产生SQL命令)。

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


35
根据Django的文档所说,迁移是Django传播您对模型所做的更改(添加字段、删除模型等)到数据库模式的方式。 makemigrations基本上为预安装的应用程序生成SQL命令(可以在settings.py中查看已安装的应用程序)以及您新创建的应用程序的模型(将其添加到已安装的应用程序中)。它不会在数据库文件中执行这些命令。因此,在makemigrations之后不会创建表格。
应用makemigrations后,您可以使用sqlmigrate查看生成的所有SQL命令,该命令显示由makemigrations生成的所有SQL命令。 migrate在数据库文件中执行这些SQL命令。因此,在执行migrate之后,已安装的应用程序的所有表格都将在数据库文件中创建。
你可以通过安装sqlite browser并打开db.sqlite3来确认这一点。在执行migrate命令后,你可以看到数据库文件中出现的所有表格。

24

众所周知,Django是一种ORM(对象关系映射)工具。当我们使用以下命令:

python manage.py makemigrations [app_name]

它会生成相应于models.py文件中每个类的表的SQL命令。然后使用以下命令:

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
);

使用上述命令,在执行迁移时,表将在数据库中创建。

5
在settings.py文件的INSTALLED APPS部分添加新应用程序后,应运行命令-migrate-以使数据库状态与当前模型集同步。假设您已经修改了models.py文件。
当您运行-makemigrations-时,它会将对模型的更改打包成单独的迁移文件。
通常,您会先运行makemigrations,然后再运行migrate。 查看Django模型文档

4
运行这两个命令是必要的,以完成将数据库表与模型同步的迁移。 makemigrations 会分析当前模型中任何与数据库不同步的更改,并创建一个迁移文件,可用于将其同步。但如果停留在此步骤,模型仍可能与数据库不同步,可能会破坏查询数据库的代码。 migrate 是“使其生效”的命令,应用在 makemigrations 阶段中记录的更改。
来源: 链接

3

Make migrations : 它基本上为预安装的应用程序和你添加到已安装的应用程序中的新创建的应用程序模型生成 SQL 命令。它不会在数据库中执行 SQL 命令。因此,实际表格不会在数据库中创建。

Migrate : 迁移执行由 make-migration 在数据库文件中生成的 SQL 命令。因此,在迁移之后,已安装应用程序的所有表都将在数据库中创建。


2

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

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

但在您的情况下,Django 要求您迁移默认迁移,在第一次运行服务器之前应运行此操作。即使没有创建第一个应用程序,这也将是相同的警告。


2
这是Django替代旧手动South迁移方式的新方法,它们可以用于记录模型中的更改,并编写将在数据库中发生的更改。迁移基本上是旧的syncdb,但它考虑了由makemigrations创建的所有迁移。

2
根据Django教程系列的第二个教程,迁移是:
使用 migrate 命令会获取所有未应用的迁移(Django 使用数据库中的特殊表 django_migrations 跟踪已应用的迁移),并将它们应用于您的数据库 - 从本质上讲,将您对模型所做的更改与数据库中的模式同步。
因此,它实际上所做的就是:
  1. 当您执行 make migrations 命令时,您正在将“指令”保存到 mysql 中
  2. 当您执行 migrate 命令时,您正在执行这些相同的指令

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接