55

根据此处的文档: 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 的内容。

4

9 回答 9

76

根据民意调查教程

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

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

于 2016-12-25T16:44:09.883 回答
32

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

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

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

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

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

于 2017-12-14T15:05:56.527 回答
19

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

python manage.py makemigrations [app_name]

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

python manage.py 迁移 [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
);

并且使用上面的命令,当我们使用迁移时,将在数据库中创建表。

于 2018-01-19T06:09:22.347 回答
3

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

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

migrate是“让它如此!”的命令 并应用在该makemigrations阶段记录的更改。

资源

于 2019-12-28T19:41:35.973 回答
2

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

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

于 2015-05-01T03:02:11.903 回答
2

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

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

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

请参阅有关 Django 模型的文档

于 2015-09-08T14:09:10.983 回答
2

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

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

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

于 2020-05-03T03:31:15.400 回答
1

根据django教程系列的第二个教程。迁移是:

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. 当您执行 migrate 命令时,您正在执行相同的指令
于 2020-10-23T20:15:11.663 回答
1

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

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

于 2021-12-28T14:07:51.110 回答