数据库迁移时遇到的问题以及迁移的执行过程

实际中遇到的一个问题

首先说一下我在实际测试时遇到的一个问题:

如果把别人的sqlite数据库覆盖掉自己的数据库的话,会出现项目migrations文件夹中的脚本与数据库的django_migrations表中的记录不一致。

再在下一次数据库同步的时候报错:脚本文件与数据库中的记录不一致

我的解决方法是将脚本与django_migrations表中的数据都删了。

但是新的问题又来了:再同步数据库(执行migrate命令)的时候报错:xxx已经存在~

不要慌~执行migrate命令的时候加上--fake后缀~~

python3 manage.py migrate --fake

然后再同步就没问题了!

问题1

执行 migrate命令时报错:

上面报错的意思是:缺少依赖的应用 customer 

解决的方法是:执行migrations命令的时候加上customer这个应用就好了:

python3 manage.py makemigrations customer

接下来再执行 migrate 命令就没问题了:

问题2

然后再一次执行migrate的时候又上报了错误:

解决的方法是先执行一次下面这段命令(在migrate后面加上 --fake 参数):

python manage.py migrate --fake

然后再执行 migrate 就没问题了~

数据库迁移的执行过程说明

1、在执行 python manage.py makemigrations 的时候django会在相应的app的migrations目录下生成一个py脚本文件

2、在执行 python manage.py migrate 的时候django才会在数据库中生成对应的表,那django是如何知道应该执行哪个文件呢?

首先,每个migrations目录可能有多个脚本,django是通过一张django-migrations表来进行判断的,这章django-migrations表记录了已经执行过的脚本——也就是说,没有执行的脚本就没有在这张表中记录,于是在执行migrate的时候只会执行表中没有记录的脚本。

3、如果有的时候执行 migrate 的时候发现没有生成对应的表,可以看看在django-session表中有没有脚本的记录——也就是这个脚本有没有执行。

4、有时我们可以删除django-session表中的记录数据库相应的表,重新执行命令生成对应的表。

5、makemigrations 生成脚本演示:

 

posted on 2019-07-12 20:02  江湖乄夜雨  阅读(920)  评论(0编辑  收藏  举报