如果迁移由于任何原因(例如错字)中途失败,则会提交一半迁移,并将其余部分留下。它似乎并没有尝试回滚它刚刚做的事情。(通过回滚包含的事务,或者调用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
不会回滚此迁移,它会回滚之前的版本,而我们会留下虚假的孤立地址记录。显然,我们可以删除重新创建数据库并从头开始运行迁移,但这不是重点 - 迁移不应该使迁移的一半完成并且数据库处于无效状态。
有解决方案吗?例如可以在迁移中放置事务,以便插入全部或全部内容吗?
如果我们在迁移失败的一半之后查看迁移表,那么它就不存在了。
注意:我们使用迁移来插入(和修改/删除)应用程序运行所需的静态数据。它不是开发数据或测试数据。例如。国家数据,货币数据以及管理员运营商等。
答案 0 :(得分:2)
您应该在事务中运行这些迁移:
DB::transaction(function () {
// Your code goes here.
}
或者您可以使用try / catch块:
try {
DB::beginTransaction();
// Your code goes here ...
DB::commit();
} catch(\Exception $e) {
DB::rollBack();
}