【发布时间】:2013-12-23 14:37:48
【问题描述】:
在开发时,我在 laravel 中遇到了很多迁移问题。
我创建了一个迁移。当我完成创建它时,迁移中间有一个小错误(例如,外键约束),导致“php artisan migrate”失败。他确实告诉我错误在哪里,但随后 migrate 进入一个不一致的状态,在错误之前对数据库进行的所有修改都是在发生错误之前进行的,而不是接下来的。
这使得当我修复错误并重新运行迁移时,第一条语句失败,因为列/表已经创建/修改。然后我知道的唯一解决方案是转到我的数据库并手动“回滚”所有内容,这需要更长的时间。
migrate:rollback 尝试回滚以前的迁移,因为当前没有成功应用。
我也尝试将我的所有代码包装到一个 DB::transaction() 中,但它仍然不起作用。
有什么解决办法吗?或者我只需要继续用手滚动东西?
编辑,添加示例(不编写模式构建器代码,只是某种伪代码):
迁移1:
Create Table users (id, name, last_name, email)
Migration1 执行正常。几天后,我们制作了迁移 2:
Create Table items (id, user_id references users.id)
Alter Table users make_some_error_here
现在将发生的情况是 migrate 将调用第一条语句并使用他的外键创建表项给用户。然后,当他尝试应用下一条语句时,它将失败。
如果我们修复 make_some_error_here,我们将无法运行 migrate,因为它已创建表“items”。我们不能回滚(也不能刷新,也不能重置),因为我们不能删除表用户,因为表项有外键约束。
那么唯一继续的方法就是去数据库手动删除表项,让迁移保持一致状态。
【问题讨论】:
-
确实,这很烦人。我也没有想出在 MySQL 事务中运行的方法。当我尝试时,它似乎完全忽略了它。
-
@Blossoming_Flower,MYSQL中的DDL语句无法回滚。阅读我的答案以获取更多详细信息和链接。谢谢。