专栏首页未闻Code一日一技:如何让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和数据库又重新同步了。

本文分享自微信公众号 - 未闻Code(itskingname)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • BigData | 从头搭建一个Spark环境(MacOS版)

    Spark的job都是JVM(Java Virtual Machine)的进程,所以在安装Spark之前需要确保已经安装好了JDK(Java Developer...

    Sam Gor
  • 【LeetCode07】旋转矩阵(一)

    题目的意思我这里在解释一下,其实就是按照指定方向,螺旋地输出所有的矩阵元素,如下面的矩阵:(从11开始,到23结束)

    Sam Gor
  • Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)

      宏哥看你骨骼惊奇,印堂发亮,必是练武之奇才! 按照上一篇的节目预告,这一篇还是继续由宏哥给小伙伴们分享元素定位,是不是按照上一篇的秘籍修炼,是不是感觉到头顶...

    北京-宏哥
  • keras量化分析之路(1)--DataFrame格式数据

    写在开头: 今天正是开始量化之路,选择keras+tushare这两个好东西

    wust小吴
  • 深度学习中常用的损失函数loss有哪些?

    这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

    小草AI
  • 分享8点超级有用的Python编程建议

    我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,现在在这里分享一下给...

    Sam Gor
  • python算法与数据结构-队列(44)

      队列的定义:队列是一种特殊的线性表,只允许在表的头部(front处)进行删除操作,在表的尾部(rear处)进行插入操作的线性数据结构,这种结构就叫做队列。进...

    Se7eN_HOU
  • 【LeetCode03】查找字符串最长公共前缀

    这道题主要考核的还是python的zip和set的用法,如果对这两个熟悉的话就可以很容易的实现。

    Sam Gor
  • 【推荐收藏】学习Python列表,只需这篇文章就够了

    千里之行,始于足下。要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好。今天,本喵带大家仔细温习一下Python的列表。温故而知新,不亦说乎。

    Sam Gor
  • opencv 9 -- 轮廓 找 和 画

    轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。 轮廓在形状分析和物体的检测和识别中很有用

    wust小吴

扫码关注云+社区

领取腾讯云代金券