以下文字不是为了推荐某种django迁移数据库的方法技巧,而是不得已而为之的办法 ( ´ _ゝ`)
情况是这样的,由于不知道为何,鬼使神差的将djangp app中migrations目录里的内容给删了,重新migrations后是肯定不行的。后来又在神志不清的情况下,手贱把数据库中django_migrations这张表给删了,最后反正就是migrate的时候,一直都提示XXXX表已经存在。
之后在网上查了很多信息,解决办法是重新在本地建一个数据库,然后将代码配置指向这个新的数据库。清除migrations文件夹中的内容。重新makemigrations和migrate。再把django_migrations这张表导到被玩坏的环境的数据库中。然后在makemigrations和migrate后,就正常了,显示no change。然后再将修改了字段的代码pull下来。就可以正常的makemigrations和migrate了。
针对这件事情记录一下自己对django迁移数据库原理的理解
迁移数据库一般通过以下两个命令实现
** python manage.py makemigrations **
** python manage.py migrate **
python manage.py makemigrations 这条命令相当于先检测你的django app目录下是否存在migrations目录,没有就新建,然后把migration代码文件写到这个目录中。 第一次必然是会生成一个0001_initial.py初始化数据的代码文件,在以后的每次修改models后makemigrations,django会比较上一个migrations文件中的model和修改后的model的差异,然后根据差异生成一个新的migrations文件。命名规则如0002xxx 0003xxx 0004xxx,都是根据上一个migrations文件的序号加1。
然后就到了执行python manage.py migrate了。这条命令相当于正式操作数据库了。正常的话,每一次执行前都会比较migration文件的名称在django_migrations表中是否已经存在,不存在再执行该代码,这样可以避免重复执行。然后将执行过的migration文件名记录在name这个字段中。
所以说这次的问题就是把migrations文件夹中的内容给删了。然后重新makemigrations是没有问题的,但是只是生产一个0001_initial.py的初始化代码文件。那这个东西其实是已经在django_migrations表中了。如果执行migrate的话,是不会生效的,因为对django来说,他已经记录在django_migrations表中了。那如果删了django_migrations表了的话。django会执行0001_initial.py,但是问题又来了。0001_initial.py里面的代码是包含整个数据库的。里面需要创建的表其实已经有了。那自然会报错说XXXX表已经存在了。那其实要做的就是告诉django,现在数据库已经执行过0001_initial了,而且有且只有这一个。所以我就想到重新建一个数据库,然后makemigrations和migrate都执行一遍,再把django_migrations表导入,然后0001_initial.py文件和django_migrations表的记录就对应起来了。在这个基础上再修改models,然后makemigrations和migrate就没有问题了。
额= =这个方式有点歪门邪道了。。。。。。。
其实这种方式感觉是很有风险的,又是删文件,又是删表的= =,但是实在想不出什么其他的方法了。。。。。。。。。。
Cloudhu 个人随笔|built by django|
沪ICP备16019452号-1