【问题标题】:rake db:migrate updating schema.rb with dropped tablesrake db:migrate 使用删除的表更新 schema.rb
【发布时间】:2013-10-16 14:59:25
【问题描述】:

我在 git 上有几个分支,这些分支的架构在不同的版本上。 切换到分支后,如果我执行 rake db:setup,可以说 new_feature(等待迁移),那么它建议我运行等待迁移。

一旦我这样做了,我的架构就会更新为在同一分支中删除的表。

如果我这样做rake db:reset,那么它工作正常。

我知道db:setupdb:reset 之间的区别。 后一个是db:drop,然后是db:setup

但我想知道为什么架构会在 rake db:migrate 上显示那些已删除的表

我确定我缺少一些关于轨道的知识 w.r.t。架构加载和迁移过程

任何见解都会有很大帮助。提前致谢

【问题讨论】:

    标签: ruby ruby-on-rails-3.2 database-schema rails-migrations


    【解决方案1】:

    听起来您的 schema.rb 已检入 git,这是一件好事。因此,当您切换分支时,您的 schema.rb 与您的实际数据库架构不同。

    rake db:migrate 只会检查 schema.rb 中的模式版本,如果数据库版本是 younger,那么它将运行所有“待定”迁移。如果运行迁移,它只会重新生成 schema.rb 文件。

    如果您的实际架构版本高于 schema.rb 中报告的版本,它会做唯一安全的事情,这没什么。理由是可能没有迁移文件来更新它,或者数据库操作可能会强制重新创建表/截断或同样令人讨厌的东西。还有其他版本不匹配的极端情况,但我想你明白了。

    因此,如果您想在分支之间保留数据,那么您有几个选择可以在迁移心态下工作。

    A) 分支之间需要的任何数据都保存在 db 种子文件中。然后您可以毫无顾虑地删除/创建您的数据库

    B) 在切换分支之前回滚不同的迁移。在新分支中再次将它们向前滚动。

    C) 作弊,删除 schema.rb 并重新运行 rake db:migrate。这是作弊,因为它很容易导致数据丢失、版本控制中的 schema.rb 不一致,以及因为您的迁移没有任何意义而让其他团队成员头疼。

    还有一点建议。如果您已将其提交到 git,请不要更改旧的迁移文件。做一个新的。它们形成一个逻辑堆栈,旨在按顺序更改您的架构。

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2018-10-06
      • 1970-01-01
      • 2016-11-19
      相关资源
      最近更新 更多