当前位置: 首页 > news >正文

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

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

django-admin startproject myproject
python manage.py startapp blog
myproject/
├── manage.py
└── myproject/
|    ├── __init__.py
|    ├── settings.py
|    ├── urls.py
|    └── wsgi.py
|___blog|___models.py|___......

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

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

from django.db import modelsclass 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 降序排列

执行

 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的时候,然后直接重新生成迁移文件,在做迁移

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

1.表名:blog_post2.字段: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

http://www.lryc.cn/news/591404.html

相关文章:

  • 从C#6天学会Python:速通基础语法(第一天)
  • C#监听txt文档获取新数据
  • [IRF/Stack]华为/新华三交换机堆叠配置
  • 虚拟化测试工具Parasoft Virtualize如何为汽车企业提供仿真测试?
  • C语言模拟面向对象三大特性与C++实现对比
  • Python 网络爬虫 —— 提交信息到网页
  • Hyperledger Fabric:构建企业区块链网络的实践指南
  • AI赋能农业:基于YOLO11的苹果瑕疵检测系统实战分享
  • 寻找数组中的多数元素:HashMap方法解析
  • 深入了解linux系统—— 信号的捕捉
  • 防止电脑息屏 html
  • 人类社会发展过程中的熵增定律
  • 共指消解技术全解析:从语言学规则到深度学习(附论文精读)
  • 01-提问的艺术:如何让AI听懂“人话”
  • Day23| 39. 组合总和、40.组合总和II、131.分割回文串
  • 【47】MFC入门到精通——MFC编辑框 按回车键 程序闪退问题 ,关闭 ESC程序退出 问题
  • 泛型与类型安全深度解析及响应式API实战
  • python网络爬虫(第二步:安装浏览器驱动,驱动浏览器加载网页、批量下载资源)
  • 板凳-------Mysql cookbook学习 (十一--------12)
  • 20250717在荣品的PRO-RK3566开发板的Android13系统下解决点屏出现问题unsupport command data type: 217
  • x3CTF-2025-web-复现
  • 深度学习 -- Tensor属性及torch梯度计算
  • 计算机的网络体系及协议模型介绍
  • 外贸ERP软件有哪些?八大热门erp软件功能测评
  • centos中新增硬盘挂载文件夹
  • 河南萌新联赛2025第(一)场:河南工业大学(补题)
  • 亚远景科技助力长城汽车,开启智能研发新征程
  • 视频安全新思路:VRM视频分片错序加密技术
  • C++性能优化与现代工程实践:打造高效可靠的软件系统
  • C++性能优化