python-Django-Django 数据库迁移(二)

2023-04-23 09:39:15 浏览数 (1)

创建迁移文件

要创建新的迁移文件,我们可以在终端中执行以下命令:

代码语言:javascript复制
python manage.py makemigrations app_name

其中,app_name是我们要创建迁移文件的应用程序的名称。如果我们没有指定app_name,Django会自动检测出我们最近修改的模型,并为其创建新的迁移文件。

在执行上述命令后,Django会分析应用程序中的所有模型,检测出所有未应用的数据库变更,并将它们记录在新的迁移文件中。这个过程通常会自动完成,无需我们手动干预。

例如,假设我们有一个简单的博客应用程序,其中包含如下的模型:

代码语言:javascript复制
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

上述模型定义了两个模型类:AuthorPostAuthor模型包含两个字段:nameemail,而Post模型包含四个字段:titlecontentpub_dateauthor。其中,author是一个外键字段,指向Author模型。

如果我们现在想要向Post模型中添加一个category字段,我们只需在模型定义中添加这个字段,如下所示:

代码语言:javascript复制
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    category = models.CharField(max_length=50, null=True, blank=True)

然后,我们可以执行makemigrations命令来创建新的迁移文件:

代码语言:javascript复制
python manage.py makemigrations blog

执行上述命令后,Django会在blog/migrations目录下创建一个新的迁移文件,文件名类似于0001_initial.py(如果这是我们的第一个迁移文件)。

在创建迁移文件后,我们可以打开它并查看它的内容。每个迁移文件都包含一个Migration类,该类包含两个属性:dependenciesoperationsdependencies属性列出了当前迁移所依赖的其他迁移文件,而operations属性则列出了当前迁移中的操作。例如,在上面的示例中,新创建的迁移文件大概长这个样子:

代码语言:javascript复制
from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('blog', '0001_initial'),  # 依赖于前一个迁移文件
    ]

    operations = [
        migrations.AddField(
            model_name='post',
            name='category',
            field=models.CharField(blank=True, max_length=50, null=True),
        ),
    ]

在上述迁移文件中,dependencies属性指定了当前迁移所依赖的其他迁移文件(即,之前的0001_initial迁移文件)。operations属性包含了一个AddField操作,该操作表示我们向Post模型中添加了一个新的category字段。这个操作包含了三个参数:

  1. model_name:指定要修改的模型类的名称(即Post)。
  2. name:指定要添加的字段的名称(即category)。
  3. field:指定要添加的字段的类型和属性(即CharField(blank=True, max_length=50, null=True))。

注意,我们可以在迁移文件中编写多个操作,而不仅仅是一个AddField操作。

在创建迁移文件后,我们可以使用migrate命令来应用该迁移:

代码语言:javascript复制
python manage.py migrate blog

执行上述命令后,Django将在数据库中创建一个新的blog_post表,并向该表中添加一个category字段。如果我们想要回滚这个迁移,我们可以执行migrate命令,并指定要回滚的迁移文件的名称:

代码语言:javascript复制
python manage.py migrate blog 0001_initial

执行上述命令后,Django会将数据库恢复到0001_initial迁移文件创建的状态,也就是删除blog_post表和category字段。

除了手动创建和应用迁移之外,Django还提供了一些其他有用的命令,以帮助我们管理数据库迁移。以下是一些常用的命令:

  1. showmigrations:显示应用程序中的所有迁移文件和它们的状态。
  2. migrate:应用所有未应用的迁移文件。
  3. makemigrations:生成一个新的迁移文件,该文件包含了所有未应用的数据库变更。
  4. migrate <app_name> <migration_name>:将数据库恢复到指定的迁移状态。
  5. migrate <app_name> zero:将数据库恢复到初始状态(即没有应用任何迁移)。
  6. migrate --fake <app_name> <migration_name>:标记指定的迁移文件已经被应用,但不会实际执行迁移操作。
  7. migrate --fake-initial <app_name>:将所有已经存在的数据库表标记为已经被迁移过,但不会实际执行迁移操作。

0 人点赞