问题 向表中添加新列时,是应该创建新迁移还是编辑旧迁移?


如果我创建一个表 rails generate migration,我可以稍后通过创建新的迁移添加一个额外的列。我还可以回滚原始迁移,然后编辑它以包含额外的列。

方法1:新迁移

//Create the model including the migration
$ rails generate model Foo bar:string

//Perform the migration
$ rake db:migrate

//Create the add column migration
$ rails generate migration add_foobar_to_foos foobar:string

//Perform the new migration
$ rake db:migrate

方法2:回滚

//Create the model including the migration
$ rails generate model Foo bar:string

//Perform the migration
$ rake db:migrate

//Rollback the migration
$ rake db:rollback

//Edit the original migration file

//Perform the new migration
$ rake db:migrate

完成此任务的正确/最佳方法是什么?为什么?


2524
2018-01-04 02:26


起源

建议的方法是使用新迁移添加新列。 - Zabba


答案:


生病了,方法1.为什么?因为如果其他开发人员/机器正在使用此环境,您可能会因为他们可能需要在正确的时间回滚以维护正确的数据库结构而获得不稳定的状态。


13
2018-01-04 05:12



这是完全正确的。如果您更改现有迁移,其他开发人员需要将其拉入并运行那些棘手的混蛋命令以使其达到与您相同的状态,甚至更糟糕的运行 rake db:schema:load。如果你已经提交了迁移,它应该 决不 更改。 - Ryan Bigg
我想我应该指定什么时候可以使用回滚。如果您创建了迁移但尚未提交/推送它,则可以回滚并编辑迁移。 - ddayan
我在这里有一个跟进问题...不支持db:重置吹走现有数据库并运行所有迁移?如果我的项目还处于起步阶段,并且我想修改以前的迁移,我不能只编辑创建表的迁移,然后执行db:reset吗? - jschank
@jschank:是的,但是你会丢失你的数据,所以它只适用于某些场景。使用新迁移适用于大多数情况。 - ddayan