Python 现代开发学习笔记

(八)迁移记录与现有数据变化

1. 当前模型与变化步骤分别保存

models.py 表达当前结构;迁移文件表达从已有结构走到这里的步骤。makemigrations 对比模型与迁移状态,生成 Python 变化记录;migrate 按依赖顺序把尚未应用的步骤执行到数据库。

配套 0001_initial.py 创建书籍、标签、关联和修改记录;0002_book_notes.py 随后添加备注字段:

# 项目文件:reading_project/src/library/migrations/0002_book_notes.py
# Generated by Django 5.2.18 on 2026-10-20 07:51

from django.db import migrations, models


class Migration(migrations.Migration):
    # 先应用初始结构,再给已有记录补上初始为空的备注列。
    dependencies = [
        ("library", "0001_initial"),
    ]

    operations = [
        migrations.AddField(
            model_name="book",
            name="notes",
            field=models.TextField(
                blank=True, default="", max_length=2000, verbose_name="阅读备注"
            ),
        ),
    ]

dependencies 要求先应用 0001,AddField 描述本次列变化。完整初始文件见 0001_initial.py。它们与代码一起保存,数据库的 django_migrations 表记录哪些步骤已经执行。

# 查看已应用与未应用的迁移,以及某一步准备执行的 SQL。
uv run python manage.py showmigrations library
uv run python manage.py sqlmigrate library 0002
# 应用所有缺少的迁移。
uv run python manage.py migrate

2. 给迁移前的书补上备注列

migration_steps.py 在临时文件先应用 0001,保存“迁移前的书”,再应用 0002。输出先是 0001 有 notes 列 False,随后原编号与书名保留,备注为 ''。

先在没有 notes 的表中保存一本书,执行 AddField 后现有行保留编号和书名,新增备注列填入默认空字符串,并记录迁移完成

新增字段后生成并检查迁移,再将其应用到数据文件;已经分享或应用的迁移继续保留,用下一份迁移记录后续变化。相关机制可查 Django 迁移。

笔记正文与全部题解 · Ctrl / ⌘ K