首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >laravel迁移使DB处于无效状态。

laravel迁移使DB处于无效状态。
EN

Stack Overflow用户
提问于 2017-10-18 15:19:04
回答 1查看 750关注 0票数 1

如果迁移由于任何原因(例如,错误)而中途失败,则提交迁移的一半,而忽略其余的迁移。它似乎不试图回滚它刚才所做的事情。(要么通过回滚包含的事务,要么调用())

如果您试图手动回滚最后一个迁移(例如php artisan migrate:rollback --step=1 ),它只回滚最后一个之前的迁移,即失败之前的迁移。

考虑一下这种迁移:

代码语言:javascript
复制
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处于无效状态。

有解决办法吗?例如,一个人可以在迁移中放置事务,这样它就可以插入所有或什么都插入吗?

如果我们在迁移表中看到一半完成的迁移失败之后,它就不在那里了。

注意:我们使用迁移来插入(并修改/删除)应用程序运行所需的静态数据。它不是开发数据或测试数据。例如国家数据,货币数据,以及管理操作员等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-18 15:23:25

您应该在事务中运行这些迁移:

代码语言:javascript
复制
DB::transaction(function () {
    // Your code goes here.
}

也可以使用try/catch块:

代码语言:javascript
复制
try {
    DB::beginTransaction();

     // Your code goes here ...

    DB::commit();
} catch(\Exception $e) {
    DB::rollBack();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46813687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档