【问题标题】:How does rake db::migrate actually workrake db::migrate 如何实际工作
【发布时间】:2011-11-23 00:35:49
【问题描述】:

我才真正开始使用 Ruby 和 Rails,我发现自己真正喜欢的一件事是它让你使用的约定。

我想在我自己的非 Ruby 项目中模仿这种行为。

我的问题是它实际上是如何工作的?我知道我可以查看 Rails 代码,但我的理解还不够深入,无法知道其中发生了什么。

我知道它需要一个基线脚本,然后针对它运行更新架构更改。但是它怎么知道它在哪个版本上呢?我将如何在另一个框架/数据库中模仿它?

【问题讨论】:

  • 它查看上次迁移是什么。它运行之后的那些。 非常广义地说,它是用于编写 SQL 的 DSL(3.1 中的可逆 SQL)。你能说得具体点吗?
  • 它的工作方式有很多种......它的哪些具体方面让您难以理解?
  • 更新了问题。我说的是迁移和拆卸(即 rake migrate 回滚)。

标签: ruby-on-rails ruby rake


【解决方案1】:

注意:这在 Rails 2.x 中是正确的。这可能不适用于 Rails 3,因为我在 Rails 3 上花费的时间并不如我所愿。

Rails 创建一个名为schema_migrations 的特殊隐藏表。此表有一个名为 version 的列。对于您拥有的每个迁移,此列中都有一行。该值是与迁移文件名时间戳匹配的时间戳。

当您迁移时,它会按时间顺序查看您的所有迁移(由于基于 timstamp 的命名约定,它也恰好是字母顺序)。对于每次迁移,它都会在 schema_migrations 表中查找匹配的行。如果找不到,则运行该迁移,并在表中添加时间戳。如果它确实找到了,它假定它已经运行并简单地跳过它。

结果是 2 个开发人员都可以按任意顺序提交迁移,这很好。这是因为 Rails 确切地知道哪些迁移已经运行,哪些没有运行,无论您的数据库何时第一次看到它们。

因此,要自己做这样的事情,您只需要一种方法来永久存储有关已采取哪些步骤以及未采取哪些步骤的状态。

【讨论】:

  • 这正是我想要的。非常感谢。
  • schema.rb 在这种情况下的相关性是什么?我将所有迁移与数据库列匹配,我对 schema.rb 没有用处?
  • 它就像一个 Photoshop 文件。迁移是层,schema.rb 是所有层组合的最终展平结果。因此,如果您只需要将模式加载到测试数据库中,您可以快速完成,而不是按顺序运行数百次迁移以获得相同的结果。
  • 我理解这个概念,也理解 Photoshop 的类比 :) 但我不确定用例,但你说的很有意义:为测试数据库加载模式。不知道还有没有其他用例?
  • 当我忘记时,我还将它用作模型存在哪些列的参考。 “用户有全名,还是名和姓?”
猜你喜欢
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2011-06-05
  • 2014-03-15
  • 2016-09-10
  • 2017-06-21
  • 1970-01-01
  • 2013-05-21
相关资源
最近更新 更多