我有多个分支,每个分支都有一个迁移文件。因此,当我签出一个分支时,我会执行db:migrate,然后它会更新我的schema.rb文件。
但是,当我签出另一个分支并运行rake db:migrate时,理想情况下,我应该从schema.rb中移除上一个分支中的迁移,并且新迁移的详细信息应该进入schema.rb
这不会发生。
所以,我做了一个rake db:rollback STEP = 5,当我签出一个新的分支然后做了db:migrate。即使是现在,我在上一个分支中有关于迁移的表详细信息。我做错了什么?或者Rails的表现如何?
答案 0 :(得分:1)
所有已执行的迁移都保存在表schema_migrations
中(迁移时间戳保存在DB中)。运行rake db:migrate
时,Rails会解析目录db/migrate
并查找表中未显示的文件(按时间戳进行比较)。
让你在分支主机中有10次迁移 - schema_migrations
有10条带时间戳的记录。您从主branch_1
创建一个新分支,在那里创建并运行一个新的迁移。您的表schema_migrations
有11条记录。
你回到主人并运行rake db:migrate
- Rails将不会因为没有找到新文件(在db/migrate
中)。当你运行rake db:rollback STEP=5
我想(我从未检查过它)Rails回滚5分支MASTER的最后一次迁移。这是合乎逻辑的,因为上一次迁移(在branch_1
中创建)在分支主服务器中不存在(包含代码的文件仅存在于branch_1中!)。因此,您无法从分支主服务器回滚在branch_1中进行的数据库更改。
什么待办事项?! 我看到了几个策略:
1)结帐到branch_1
并运行rake db:rollback STEP=N
(N> =新迁移次数)(您可以回滚在此分支中执行的更多迁移)。结帐回master
并运行rake db:migrate
(从主服务器执行迁移)
2)当你有生产转储或良好的种子。
删除当前数据库,装载转储(或种子),运行rake db:migrate
(至于我,这是生产转储时最简单的方法!)
PS也许smbd else建议在当前分支中获得正确DB的其他方法