从schema.rb生成迁移文件

36

我希望从schema.rb生成一个迁移文件,这可能吗?

我现在有很多迁移文件,想把它们合并成一个主迁移文件。

我还认为我可能无意中删除了一个迁移文件。

感谢任何帮助。


虽然在技术上可以合并迁移,但我认为这是一个非常糟糕的想法...不要这样做!使用一个好的版本控制系统,例如Git。 - Tilo
2个回答

62
你可以将schema.rb复制粘贴到迁移中并回溯日期(例如更改日期),以便没有现有数据库会运行它。创建此迁移后,可以删除所有旧的迁移。
我不同意安德鲁的观点,认为你永远不应该删除迁移。基于模型类的更改,迁移经常意外中断,并且非常难以修复。由于我确定你正在使用版本控制,因此如果需要参考,您可以随时查看历史记录。

6
我建议迁移不应该依赖于模型类,否则随着您的模型更改,它们肯定会逐渐失效。如果您需要使用模型的功能,可以在迁移过程中包含一个简单的、一次性的模型定义。 - David Keener
5
虽然原则上很好,但在实践中难以执行。 - ghempton
8
感谢@ghempton实际上按照所写的问题回答,而不是说“没有必要这样做”。总是有需要和理由去做一些别人可能不同意的事情。 - Midwire
2
回溯日期并未阻止迁移的运行。Rails 4.2。请参阅此处https://dev59.com/m2ct5IYBdhLWcg3wgNYy。 - dsieczko
1
我直接将Rails迁移文件的时间戳部分插入到了“schema_migrations”表中的“version”列下,因此我不需要运行从模式创建的迁移。 - dsieczko
1
对我而言有效的方法是创建一个空迁移,通过我们通常的工作流程在服务器上运行它(从而使服务器记住它已经运行了迁移),然后将模式放在那里并删除所有先前的迁移。这可能是唯一一个编辑已应用迁移可能是个好主意的场合,因为它不会被重新应用。 - Ivan Kolmychek

28

不需要这样做。对于新的安装,你应该运行rake db:schema:load而不是rake db:migrate,这将把模式加载到数据库中,比运行所有迁移更快。

你永远不应该删除迁移,更不要合并它们。如果不小心删除了一个,你应该使用版本控制系统,例如Git


7
你能提供一些证据表明这是个坏主意吗? - Tomek Paczkowski
3
我一直认为使用迁移的目的是为了能够使用比SQL更方便的语言,并且可以重复使用已经编写好的代码。我认为删除迁移是一个不错的想法,因为你应该使用schema:load而不是migrate,并且应该将你的代码保存在版本控制系统中,所以删除旧的迁移不会有任何伤害。那只是一些从未执行过的死代码。 - Tomek Paczkowski
我认为正常的做法应该是保留所有迁移,并使用新的迁移来修改数据库,而不是修改迁移。 - ReggieB
在构建引擎时,合并迁移可能非常有意义:引擎中的迁移会从引擎复制到主机。当使用您的引擎时,我不认为大多数应用程序构建者希望将一长串开发迁移复制到他们的应用程序中。在首次发布引擎之前合并迁移是有意义的。 - ReggieB
4
在理想的情况下,您不希望删除迁移,但是...另一个需要删除/重置迁移的真实案例是,如果有人通过命令行修改了数据库,并且这些更改从未添加到迁移中(即某人打乱了流程)。这些情况可能会使得解决迁移和数据库之间的差异变得困难,因此可能需要进行新的模式转储,删除所有现有的迁移,然后将当前模式加载到新的第一个迁移中。 - bob
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接