laravel 数据库迁移回滚

今日在laravel 框架数据库迁移回滚方面,有幸遇到一个坑,突发奇想解决方案,索性在这里分享下。

先附上laravel 中国数据库迁移回滚文档链接:https://laravel-china.org/docs/laravel/5.3/migrations/1189#rolling-back-migrations

。文档说了一些数据库迁移和回滚的操作,但实际工作中,有时候需要回滚特定的迁移文件,这也是本篇文章的主要内容。

 

背景

今日在测试服上,一个不小心让测试妹子切换了git 代码分支,并执行了迁移(记住,这是大忌,当然要是数据库归运维管就另当别论了),后来发现数据库表迁移文件某个字段名没有修改过来。想执行回滚,结果报错了,原因就是之前在其它分支执行了迁移,但是迁移文件又在其它分支,所以执行回滚就报了个undefined index  xxxx(数据库迁移文件名)。

思考过程

 针对以上骚操作,想了三个解决方案

1.合并代码,再执行回滚

2.想办法回滚某个特定的迁移文件

3.换库 --- 这是万不得已的操作

思考了片刻,果断采用第二种方案,第一种方法说不定还要去修改冲突,麻烦。后来,想了下,执行数据库迁移回滚肯定是有个地方记录迁移回滚的,第一想法是打开数据库看下表(平时看得少,毕竟200多张表,都不知道是什么鬼),一张名为migration 的表引起了我的注意,打开表结构和数据一看,会看到类似于以下的数据:

 

laravel 数据库迁移回滚_第1张图片

 

相比聪明的你,马上就能看明白数据,左边的是表迁移文件,右边是批处理了的次数(即执行迁移了的次数),每执行一次迁移都会在现有数据的最大值上加1,一般是递增,如果是一次性执行多个迁移文件,那么该次执行的迁移文件batch 数是相同的。

解决问题

现在来看下,回滚某个指定的迁移怎么做呢?如果是回滚最后几个迁移还好办,直接使用laravel-china 提供的方法:

php artisan migrate:rollback --step=5

step 后面跟上步数即可,上面回滚最后的 5 个迁移。但往往我们要面临和处理的问题没这么简单(起码我遇到的就没这么简单),废话有点多,下面结合场景来说下我的解决方案:

当我执行迁移后,会发现migration 表里会多出很多条记录

laravel 数据库迁移回滚_第2张图片

好了,差不多问题还原了,我现在想要 回滚 2018_11_05_092343_create_dyeerp_other_problem_table 这个迁移表,该怎么做?而且现在又回滚不了-- 这里假设回滚会报错,解决起来比较麻烦或者压根没时间解决!!!

我的解决方案很突发奇想,在migration 这个表里面删除 2018_11_05_092343_create_dyeerp_other_problem_table 对应的记录,然后再删除对应的数据表,再修改迁移文件,再次执行迁移。

操作流程:

先执行迁移,检测下

D:\code>php artisan migrate
Nothing to migrate.

D:\code>

删除migration 表里对应的迁移记录 , 这里对应删除2018_11_05_092343_create_dyeerp_other_problem_table 这表记录。

删除对应的表:

laravel 数据库迁移回滚_第3张图片

然后修改迁移文件--改成你需要的内容即可,修不修改不影响后续操作(只要你文件没错就OK)

再次执行迁移:

D:\code>php artisan migrate
Migrated: 2018_11_05_092343_create_dyeerp_other_problem_table

D:\code>

migration 表里的记录

laravel 数据库迁移回滚_第4张图片

 

可以发现问题解决,而且batch值增1。

 

这里暂只附上解决方案,至于背后的原理,且看后续连载。

你可能感兴趣的:(php,laravel)