Django的数据库模型迁移命令makemigrations和migrate是否会导致数据库中的数据丢失?

我们知道,如果在Django的文件models.py中写好了数据库模型,要生成对应的数据库,需要执行下面两条命令:

python manage.py makemigrations
python manage.py migrate

其中命令 makemigrations 是生成迁移执行文件,命令 migrate 是执行迁移命令。

那么如果修改了数据库模型文件models.py的内容,比如新增了一张表,那么是否会造成原来数据库的数据丢失呢?
答:运行python manage.py makemigrationspython manage.py migrate命令不会直接导致原有数据丢失。这两个命令是用于在 Django 中管理数据库模型和执行数据库迁移的工具。

makemigrations命令会检测你对模型的更改,并生成迁移文件,该文件描述了如何在数据库中进行更改以适应新模型。这个命令不会对数据库进行实际更改,它只是生成迁移文件。

migrate命令是用来应用数据库迁移的。它会读取迁移文件,并根据其中的描述来修改数据库结构以适应新的模型。这个命令会根据迁移文件的内容执行相应的操作,包括创建新表、修改现有表结构、添加或删除字段等。

在运行migrate命令之前,Django 会检查已应用的迁移记录,以确定哪些迁移是未应用的。然后,它将按顺序应用那些尚未应用的迁移文件,确保数据库与最新的模型定义一致。

除非你在模型定义中有删除表或字段的操作,否则运行这两个命令不会导致数据丢失。Django 会尽可能地保留现有数据,并根据迁移文件进行相应的结构修改。

不过,作为一种良好的开发实践,在运行任何可能会影响数据库结构的迁移命令之前,强烈建议备份数据库以防万一。这样可以在出现问题时恢复到先前的状态。

下面以一个实际例子来说明:
当前数据库中已经存在了表app1_user,并且已经存在了数据,如下面的截图所示:
在这里插入图片描述
现在我们对数据库模型文件"E:\Python_project\P_001\myshop-test\myshop\app1\models.py"进行修改,增加表app1_author和表app1_post,更新后的 models.py 的内容如下:

from django.db import models

# Create your models here.


class User(models.Model):
    username = models.CharField(max_length=50)
    email = models.EmailField(unique=True)
    # 其他字段...

    def __str__(self):
        return self.username


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

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

接下来,运行下面的命令:

CD E:\Python_project\P_001\myshop-test\myshop
E:
python manage.py makemigrations
python manage.py migrate

在这里插入图片描述
从上面的截图中可以看出,makemigrations 命令分析出了,这次的更新是增加 model Author 和 model Post,此时我们再看数据库,如下:
在这里插入图片描述
从上图我们可以看出,成功的增加了表app1_author和表app1_post,原来的表app1_user及其数据仍然都在。

猜你喜欢

转载自blog.csdn.net/wenhao_ir/article/details/131604241