2009-06-17 136 views
20

是否rake db:迁移只添加新的迁移,还是会删除所有迁移/更改并构建新的一切?究竟是什么耙db:migrate做什么?

我认为rake抛出一个错误,因为它试图访问在迁移042中删除的迁移040中的表属性。不知怎的,我的数据库和耙子不同步,我想修复它们。

你专家在那里 - 是常见的耙出去与迁移不同步?我怎么能避免这个(不,我不手动编辑我的架构或耙文件)。

回答

14

每当你使用脚本(如脚本/生成模型......)的新移民加入到正确的目录准备与真正的数据库同步的创建迁移。

其实耙分贝:迁移只是检查哪个丢失迁移仍然需要,而无需关心previouse那些被应用到数据库中。

当然,如果你修改使用其他方式的数据库是常见的获得外的同步事情,因为如你所说,你可以发现你要迁移到的东西是下面改变。

21

当您使用rails迁移时,会自动创建一个名为schema_migrations的表,该表通过存储每个迁移的版本号(这是在文件名中预设迁移名称的编号),以跟踪已应用迁移的情况,即db/migrate/_20090617111204__migration.rb)。当您运行rake db:migrate迁移了,只有以前没有被运行的迁移(即它们的版本没有在表中包含)将运行(因为这个原因,改变这种运行db:migrate当包括已经执行不会有任何影响迁移)。在向下迁移时,在schema_migrations中发现的所有版本都大于您要回滚到的版本将被撤消。

+2

谢天谢地,这个答案为我提供了更多细节。为什么db:migrate文档中的schema_migrations不在任何位置?这是我对轨道系统如何“发现哪些移动应该运行”的理解的缺失部分! – 2013-01-08 22:14:17

5

迁移意味着你从当前版本到新版本移动(如在第一个答案是说)。使用rake db:migrate可以将任何新的更改应用于您的模式。但是如果你想回滚到以前的迁移,你可以使用rake db:rollback来取消新的更改,如果它们被错误定义的话。小心:这样做会使数据丢失。