如果迁移由于任何原因(例如,错误)而中途失败,则提交迁移的一半,而忽略其余的迁移。它似乎不试图回滚它刚才所做的事情。(要么通过回滚包含的事务,要么调用())
如果您试图手动回滚最后一个迁移(例如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();
}如果客户的插入失败(例如,我们忘记设置非空列、错误或不应该存在的记录),则插入地址记录。
migrate:rollback不回滚这个迁移,它回滚以前的迁移,我们留下一个虚假的孤立地址记录。显然,我们可以删除重新创建db并从头开始运行迁移,但这不是重点--迁移不应使完成的迁移和DB处于无效状态。
有解决办法吗?例如,一个人可以在迁移中放置事务,这样它就可以插入所有或什么都插入吗?
如果我们在迁移表中看到一半完成的迁移失败之后,它就不在那里了。
注意:我们使用迁移来插入(并修改/删除)应用程序运行所需的静态数据。它不是开发数据或测试数据。例如国家数据,货币数据,以及管理操作员等。
发布于 2017-10-18 15:23:25
您应该在事务中运行这些迁移:
DB::transaction(function () {
// Your code goes here.
}也可以使用try/catch块:
try {
DB::beginTransaction();
// Your code goes here ...
DB::commit();
} catch(\Exception $e) {
DB::rollBack();
}https://stackoverflow.com/questions/46813687
复制相似问题