【问题标题】:Generate a migration file from schema.rb从 schema.rb 生成迁移文件
【发布时间】:2011-07-10 15:17:06
【问题描述】:

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

我目前有许多迁移文件,并希望将所有内容合并到一个主迁移文件中。

我还认为我可能在某些时候不小心删除了迁移文件。

感谢您的帮助

【问题讨论】:

  • 虽然技术上可以结合迁移,但我认为这是一个非常糟糕的主意.. 不要这样做!并使用良好的版本控制系统,例如Git

标签: ruby-on-rails ruby ruby-on-rails-3 migration


【解决方案1】:

您可以将 schema.rb 复制并粘贴到迁移中并回溯它(例如更改日期),这样现有数据库就不会运行它。创建此迁移后,您可以删除所有旧迁移。

我不同意 Andrew 的观点,即您永远不应该删除迁移。基于模型类的变化,迁移总是出乎意料地中断,修复它们非常重要。由于我确定您使用的是版本控制,因此如果您需要参考历史记录,您可以随时回顾。

【讨论】:

  • 我谦虚地建议迁移不应该依赖于模型类,否则它们会随着模型的变化而随着时间的推移而中断。如果您需要模型的强大功能,您可以在迁移本身中包含一个简单的一次性模型定义。
  • 虽然原则上很好,但在实践中很难执行。
  • @ghempton,感谢您实际回答书面问题,而不是说“没有必要这样做”。总是有需要和理由去做别人可能不同意的事情。
  • 回溯并没有阻止迁移的运行。导轨 4.2。见这里stackoverflow.com/questions/12057408/…
  • 我将 rails 迁移文件的时间戳部分直接插入到服务器的“版本”列下的“schema_migrations”表中,我不需要运行从架构创建的迁移。
【解决方案2】:

没有必要这样做。对于新安装,您应该运行 rake db:schema:load,而不是 rake db:migrate,这会将架构加载到数据库中,这比运行所有迁移要快。

您不应该删除迁移,当然也不应该合并它们。至于误删,应该是version control system,比如Git

【讨论】:

  • 你能提供一些证据证明这是个坏主意吗?
  • @Tomek 删除/合并迁移很糟糕?这与您永远不会真正想要删除旧提交的原因几乎相同。迁移提供了数据库的历史记录。无论如何,真的没有太多的理由。我从事过具有成百上千次迁移的项目,并且有一次早期的迁移崩溃了,因为无论如何我们都无法回滚那么远,还有其他一些原因。但这不是我的决定。不过,就像我说的那样,在大多数情况下,合并迁移并没有任何意义(永远不应该删除)。
  • 另外,就像 Gordon 在下面的回答中所说,由于应用程序的延迟状态,旧的迁移可能会损坏。在几乎所有情况下,都可以通过在迁移中最小化模型的使用并可能对它们进行存根来避免这种情况。人们似乎总是害怕在迁移中使用 SQL — 但这是迁移! SQL 更持久,因为它不依赖于您的应用程序。
  • 我一直认为使用迁移的目的是能够使用比 SQL 更方便的语言并重用您已经编写的代码。我对删除迁移有很好的想法,并且由于您应该使用 schema:load 而不是 migrate 并且您应该将代码保留在 VCS 中,因此删除旧迁移应该没有害处。它只是从未执行过的死代码。
  • 在一个完美的世界里,你不想删除迁移,但是......另一个删除/重置迁移的真实案例是,如果有人从命令行修改了数据库并且从未添加过更改迁移(即有人搞砸了流程)。这些场景可能会导致难以识别迁移和数据库之间的差异,因此可能需要进行新的模式转储,删除所有现有迁移,然后将当前模式加载到新的第一个迁移中。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2013-01-09
  • 2017-12-24
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2021-06-16
相关资源
最近更新 更多