laravel migrations离开数据库处于无效状态
如果由于某种原因(例如,错字)中途迁移失败,它会提交一半的迁移,并将其余部分退出。它似乎没有尝试回滚它所做的事情(通过回滚一个包含事务或调用())laravel migrations离开数据库处于无效状态
如果您尝试手动回滚上次迁移, “php artisan migrate:rollback --step = 1”,它只回退上次之前的迁移,即在失败之前的回滚。如果客户的插入失败
公共功能了()
{
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。
迁移:回滚不回滚此迁移,它回滚之前,我们留下一个虚假的孤儿地址记录。显然,我们可以删除重新创建数据库并从头开始迁移,但那不是重点 - 迁移不应该让迁移完成的一半和数据库处于无效状态。
有没有解决方案?例如是否可以在迁移中放入交易,以便插入全部或全部?
如果我们在完成一半的迁移失败后查看迁移表,则不存在。
注意:我们使用迁移来插入(和修改/删除)应用程序运行所需的静态数据。它不是开发数据或测试数据。例如。国家的数据,货币数据,以及管理运营等
您应该运行在一个事务中这些迁移:
DB::transaction(function() {
// Your code goes here.
}
,或者你可以使用try/catch块:
try {
DB::beginTransaction();
// Your code goes here ...
DB::commit();
} catch(\Exception $e) {
DB::rollBack();
}
辉煌,这工作。我在主代码中使用了两种形式的事务,但迁移数据库语法与雄辩文档完全不同,这一直是一个谜 - 我们只能通过网上的例子和/或猜测来综合它。 –
另外我相信你可以通过在你的迁移中导入'DatabaseMigrations'特性来完成我在评论中提到的内容。 –
嗨,你知道我在哪里可以找到有关DatabaseMigrations trait的文档(它是什么,如何使用等)。谷歌只是发现错误报告和单元测试讨论。 –
我我从未尝试添加交易,但它可能有效。我可能不得不在下一次尝试,而不是在进行回滚/迁移时不断地注释行。 – aynber