如果迁移由于任何原因(例如错字)中途失败,则它将迁移一半,并将其余部分留下 . 它似乎没有尝试回滚它刚刚做的事情 . (通过回滚包含事务或调用down())
如果您尝试手动回滚上次迁移,例如 php artisan migrate:rollback --step=1
,它仅回滚最后一次的迁移,即失败前的迁移 .
考虑这种迁移:
public function up()
{
DB::table('address')->insert(['id'=>1,'street'=>'Demo', 'country_id'=>83]);
DB::table('customer')->insert(['id'=>1,'username'=>'demo','address_id'=>1]);
}
public function down()
{
DB::table('customer')->where('id',1)->delete();
DB::table('address')->where('id',1)->delete();
}
如果客户的插入失败(例如,我们忘记设置非空列,拼写错误或记录不存在时),则插入地址记录WAS .
migrate:rollback
不回滚此迁移,它回滚之前的那个,我们留下了一个虚假的孤立地址记录 . 显然,我们可以删除重新创建数据库并从头开始运行迁移,但这不是重点 - 迁移不应该使迁移的一半完成并且数据库处于无效状态 .
有解决方案吗?例如可以在迁移中放置事务,以便插入全部或全部内容吗?
如果我们在迁移失败的一半之后查看迁移表,那么它就不存在了 .
注意:我们使用迁移来插入(和修改/删除)应用程序运行所需的静态数据 . 它不是开发数据或测试数据 . 例如 . 国家数据,货币数据以及管理员运营商等
1 回答
您应该在事务中运行这些迁移:
或者您可以使用try / catch块: