一日一技:如何让Django 的app migration重新与数据库同步

简介: 一日一技:如何让Django 的app migration重新与数据库同步

今天的文章,没有用过Django的同学可能难以理解我在说什么。但是如果你被Django的migration折腾过,那么你一定会感谢这篇文章。

当我们使用Django + MySQL开发网站服务的时候,我们应该始终使用Django来管理数据库,无论是增加字段,删除字段,修改字段,都应该直接修改Django工程 app里面对应的 models.py文件,不应该再手动直接修改数据库。

但这种理想的情况有时候会被打破。我最近遇到了这样一种情况:

出于安全考虑,我把线上的MySQL数据库禁用了 drop的权限。但由于我修改了 models.py文件中的字段,于是触发了 drop字段的操作,由于没有权限,导致Django在migration线上数据库的时候报错。

由于上线时间紧急,当时我直接通过执行SQL语句在线上MySQL中创建了对应的数据表和字段。

现在就出现问题了:

  1. 首先,Django的web服务能够正常工作,因为数据表是完全正确的。
  2. app的migration一共有10条,在进行到第6条的时候报错。剩下的4步无法继续执行。
  3. 数据库经过人工修改,看起来像是把所有migration都执行完的样子,但实际上最后4步是通过执行SQL语句手动创建的。
  4. 如果不增删改新的字段,那么到目前为止不会有什么问题。但是如果增加修改了新的字段,migration将会始终失败。除非每一次都手动修改数据库。

现在的情况就是数据库与Migration不一致,可以使用下面的命令重新同步migration和数据库。

# 清除迁移历史记录
python manage.py migrate --fake app_name zero
# 查看当前的migration进度,此时文件前的 [x] 变成了[ ]
python manage.py showmigrations app_name
#删除app-migrations下除__init__.py的其他文件
#执行makemigrations,程序会再次为这个app 生成 0001_initial.py 文件
python manage.py makemigrations app_name
# 把当前数据库的状态作为初始状态
python manage.py migrate --fake-initial app_name

从现在开始,你再次对数据库进行更改以后,重新make migration,所有新的操作都会基于当前的数据库状态继续进行,migration和数据库又重新同步了。

目录
相关文章
|
4月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
4天前
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
15 4
|
1月前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
2月前
|
缓存 关系型数据库 MySQL
高并发架构系列:数据库主从同步的 3 种方案
本文详解高并发场景下数据库主从同步的三种解决方案:数据主从同步、数据库半同步复制、数据库中间件同步和缓存记录写key同步,旨在帮助解决数据一致性问题。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
高并发架构系列:数据库主从同步的 3 种方案
|
3月前
|
算法 大数据 数据库
云计算与大数据平台的数据库迁移与同步
本文详细介绍了云计算与大数据平台的数据库迁移与同步的核心概念、算法原理、具体操作步骤、数学模型公式、代码实例及未来发展趋势与挑战。涵盖全量与增量迁移、一致性与异步复制等内容,旨在帮助读者全面了解并应对相关技术挑战。
72 3
|
3月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
127 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
3月前
|
NoSQL 关系型数据库 MySQL
AWS Database Migration Service 助力数据库搬迁
AWS Database Migration Service 助力数据库搬迁
|
3月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
113 0
|
4月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
5月前
|
C# 开发者 Windows
全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
115 0

热门文章

最新文章