rake db:migrate究竟是什么做的?

时间:2009-06-17 13:55:17

标签: ruby-on-rails migration rake

rake db:migrate是否仅添加新的迁移,还是删除所有迁移/更改并构建所有新的迁移?

我认为rake正在抛出错误,因为它试图访问迁移040中删除的迁移040中的表属性。不知怎的,我的DB和rake不同步,我想修复它们。

对于那里的专家 - rake与迁移不同步是否常见?我怎么能避免这种情况(不,我不会手工编辑我的架构或rake文件)。

3 个答案:

答案 0 :(得分:24)

使用rails迁移时,会自动创建一个名为schema_migrations的表,通过存储每次迁移的版本号(这是迁移名称前面的数字)来跟踪已应用的迁移。文件名,即db / migrate / _20090617111204__migration.rb)。当您运行rake db:migrate进行迁移时,只会运行之前未运行的迁移(即表中未包含其版本)(因此,更改已执行的迁移将不会运行db:migrate时的效果。向下迁移时,schema_migrations中找到的所有版本都将大于您回滚的版本。

答案 1 :(得分:16)

每次使用脚本(如脚本/生成模型......)创建迁移时,都会将新迁移添加到正确的目录中,以便与真实数据库同步。

实际上rake db:migrate只会检查哪些丢失的迁移仍然需要应用到数据库而不关心前一个。

当然,如果您使用其他方式修改数据库,通常会获得不同步的事情,因为正如您所说,您可以发现自己将迁移应用于下面更改的内容。

答案 2 :(得分:5)

迁移意味着您从当前版本迁移到更新版本(如第一个答案中所述)。使用rake db:migrate,您可以对架构应用任何新的更改。但是,如果要回滚到先前的迁移,可以使用rake db:rollback来取消新更改(如果定义不正确)。警告:通过这样做,您的数据将会丢失。