Django 1.8 - 迁移和makemigrations之间的区别是什么?

时间:2015-05-01 01:04:13

标签: django database-migration django-south schema-migration

根据此处的文件: 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项目并将我的应用程序添加到我的" 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的内容。

8 个答案:

答案 0 :(得分:25)

根据Polls tutorial

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

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

答案 1 :(得分:9)

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

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

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

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

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

答案 2 :(得分:6)

我们知道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时,将在数据库中创建表。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

通常,您首先运行makemigrations然后迁移。

See documentation on Django Models

答案 5 :(得分:2)

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

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

但是,在您的情况下,Django要求您迁移应在首次运行服务器之前运行的DEFAULT迁移。即使没有创建第一个应用,这也将是同样的警告。

答案 6 :(得分:0)

有必要同时运行这两个命令来完成数据库表的迁移,以使其与模型同步。

makemigrations只是分析您当前的模型以查找与数据库不同步的任何更改,并创建一个可用于同步的迁移文件。如果此刻不做,您的模型仍将与数据库不同步,可能会破坏查询数据库的代码。

migrate是“做到这一点!”的命令。并应用在迁移阶段记录的更改。

Source

答案 7 :(得分:0)

根据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.

几乎所有它要做的是:

  1. 执行make migrations命令时,您会将“指令”保存到mysql
  2. 执行迁移命令时,您正在执行相同的指令