2011-11-23 96 views
7

我刚刚开始使用Ruby和Rails,而且我发现自己真正享受的其中一件事是它使您使用的约定。rake db :: migrate如何实际工作

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

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

我知道它需要一个基线脚本,然后对它运行更新模式更改。但是它如何知道它的版本?我会如何模仿另一个框架/数据库?

+1

它看起来是什么最后一次迁移。它运行那些后来的。 *非常广泛地说,它是一个用于编写SQL的DSL(3.1中的可逆SQL)。你可以说得更详细点吗? –

+0

它在很多方面起作用......它的特定方面避开了你? –

+0

更新了问题。我正在专门讨论迁移和拆卸(即耙子迁移回滚)。 – Dan

回答

21

注意:至于Rails 2.x,这是真的。它可能不适用于Rails 3,因为我没有像Rails 3那样花费太多时间。

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

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

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

因此,要做到像这样的事情,你只需要一种方法来永久存储这个状态,哪些步骤已被采取,哪些没有。

+0

这正是我所期待的。谢谢一堆。 – Dan

+0

在这种情况下schema.rb的相关性是什么?我将所有迁移与数据库列匹配,我将无法使用schema.rb? –

+0

这就像一个photoshop文件。迁移是图层和schema.rb是所有图层合并的最终展平结果。因此,如果您只需将模式加载到测试数据库中,则可以快速执行此操作,而不是按顺序运行数百次迁移以获得相同的结果。 –