Django由于数据库版本原因导致数据库迁移失败解决办法

在django开发中,一般我们初始化一个项目之后,创建应用一般就会生成如下的目录:

bash 复制代码
django-admin startproject myproject
python manage.py startapp blog
XML 复制代码
myproject/
├── manage.py
└── myproject/
|    ├── __init__.py
|    ├── settings.py
|    ├── urls.py
|    └── wsgi.py
|___blog
    |___models.py
    |___......

其中model.py就是定义数据库表的文件。文件中的每个类就是就对应的数据库中的每张表。

比如models.py里面有如下一个类和对应的数据库中的关系如下所示:

python 复制代码
from django.db import models

class BlogPost(models.Model):
    """
    博客文章模型类
    数据库中对应的表名为: blog_post (Django 自动将类名转换为小写并用下划线连接)
    """
    title = models.CharField(max_length=200, verbose_name="文章标题")
    # 数据库对应: VARCHAR(200) 字段,NOT NULL 约束

    content = models.TextField(verbose_name="文章内容")
    # 数据库对应: TEXT 字段,NOT NULL 约束

    author = models.ForeignKey(
        'auth.User',
        on_delete=models.CASCADE,
        verbose_name="作者"
    )
    # 数据库对应: 外键字段,关联到 auth_user 表的 id 字段
    # 实际存储为 author_id 整数列

    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    # 数据库对应: DATETIME 字段,NOT NULL
    # 仅在对象首次创建时自动设置为当前时间

    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
    # 数据库对应: DATETIME 字段,NOT NULL
    # 每次保存对象时自动更新为当前时间

    is_published = models.BooleanField(default=False, verbose_name="是否发布")
    # 数据库对应: BOOLEAN/TINYINT(1) 字段,默认值为 0 (False)

    class Meta:
        verbose_name = "博客文章"
        verbose_name_plural = "博客文章"
        ordering = ['-created_at']
        # 数据库对应: 表将按 created_at 降序排列

执行

bash 复制代码
 python manage.py makemigrations 
 python migrate 

这里执行makemigrations的作用就在在对应的app目录下面生成migrations目录,里面会有一些python文件,记录了对model.py的修改。相当于git可以对models.py的每次修改做checkpoint。 举个例子。比如我在models.py里面第一次创建了数据库类,执行了makemigrations命令,这样就会在对应的migrations目录下面生成一个pyhton文件,编号从0001_.......py开始记录这一次的改动。后来我又修改了model.py里面的一些字段的命名。执行了makemigrations命令,这样就又会生成第二个0002_.......py文件。里面保存了这次对于这些字段修改的checkpoint。同时在django中,这个下面生成的文件名是易读的,可以从文件名大概知道改动的内容。

第二个执行完makemigrations命令之后,执行migrate就是把生成的哪些编号从0001开始的哪些文件的改动,同步到数据库中,该建表的建表。该修改字段的修改字段等等。这一步就是对数据库真正产生影响的步骤。

所以这里在做数据库迁移的时候,如果遇到迁移失败,我们是其实可以像git一样,回退迁移文件到最开始的时候也就是__inti__.py的时候,然后直接重新生成迁移文件,在做迁移

比如上面的代码执行之后,最后会在数据库中创建以下结构的表:

bash 复制代码
1.表名:blog_post

2.字段:

    id (自动创建的主键,INTEGER PRIMARY KEY AUTOINCREMENT)

    title (VARCHAR(200) NOT NULL)

    content (TEXT NOT NULL)

    author_id (INTEGER NOT NULL, 外键关联到 auth_user 表)

    created_at (DATETIME NOT NULL)

    updated_at (DATETIME NOT NULL)

    is_published (BOOLEAN/TINYINT(1) NOT NULL, 默认 0)

3.外键约束:

    FOREIGN KEY(author_id) REFERENCES auth_user(id) ON DELETE CASCADE
相关推荐
FITA阿泽要努力3 分钟前
/goal 命令:给 Agent 设定目标
服务器·人工智能·python·agent
鸠摩智首席音效师7 分钟前
如何清理 ASP.NET 临时文件 ?
后端·asp.net
铁皮饭盒7 分钟前
刷到 FDE 岗位那一刻,我还以为前端又活了
前端·后端
小小张说故事24 分钟前
Python 的 dict 为什么插入顺序不会乱?拆开 3.6 的紧凑布局:indices 与 entries 两张表
python
椰萝Yerosius25 分钟前
严正声明 | 博主已正式放弃CSDN作为博客平台
python
利威尔xu34 分钟前
Go GMP 调度器 10 个高频追问:3 个线上故障让 P99 从 80ms 飙到 2s、10 万 goroutine 泄漏
开发语言·后端·面试·性能优化·golang
肖永威41 分钟前
python版微电网仿真工具的前端托管选型:从http.server到FastAPI StaticFiles
前端·python·http·fastapi
梦影_43 分钟前
MySQL进阶教程(二)—— 储存过程与触发器(下)
开发语言·数据库·后端·sql·mysql·oracle·数据库开发
IT_陈寒44 分钟前
为什么你应该学习Java?
前端·人工智能·后端
AINative软件工程1 小时前
LLM 应用的 Read-Your-Writes 一致性工程实践:写完就读,模型却返回旧数据
后端