Rails如何跟踪数据库运行了哪些迁移?


93

根据Rails的文档:http//guides.rubyonrails.org/migrations.html

“ Active Record跟踪已经运行了哪些迁移,因此您要做的就是更新源并运行rake db:migrate。”

ActiveRecord实际上是如何做到的?Active Record在哪里存储数据?

我怀疑这可能存储在数据库本身中?在某处的桌子上。

在开发机器上,我运行了所有迁移。然后,我使用mysqldump复制了生产数据库。然后我运行“ rake db:migrate:status”,它正确显示了需要在生产数据库上运行的迁移。

我曾经认为ActiveRecord使用时间戳跟踪上一次迁移运行。但是我认为这是不对的,因为ActiveRecord可以正确运行从另一个代码分支合并的“较旧”迁移。

有内部知识的人可以详细说明吗?谢谢


1
我相信它在数据库中有一个跟踪表。
杰克·富兰克林2012年

Answers:


166

Rails在数据库中创建一个表,schema_migrations用于跟踪已运行的迁移。

该表包含单个列version。当Rails运行迁移时,它会在迁移文件名中使用前导数字,并为该“版本”插入一行,表示已运行。如果回滚该迁移,Rails将从中删除相应的行schema_migrations

例如,运行名为的迁移文件20120620193144_create_users.rb20120620193144schema_migrations表中插入新版本的。

您随时可以随意介绍早期版本的迁移。Rails将始终运行在中没有相应行的任何新迁移schema_migrations。前导数字不必是时间戳,您可以称您的迁移001_blah.rb。Rails的早期版本使用这种格式,并对新生成的迁移使用顺序编号。更高版本已切换到时间戳,以帮助防止多个开发人员独立生成具有相同编号的迁移。


当您混合使用可安装的引擎和虚拟应用程序时特别有用
Donato
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.