如何在git分支中管理对数据库的更改?

时间:2013-05-28 07:42:53

标签: ruby-on-rails database git migration

所以,我有一个我正在试验的应用程序。

当前状态在我的develop分支上很好。我想安装spree,但随之而来的是db的许多迁移和更改。

所以我根据我的develop分支为Spree创建了一个新的分支。

我安装了gem,运行了迁移,以及所有这些。

但是,我搞砸了一些东西,所以我想恢复到我的develop分支并删除了spree分支。

我认为我的schema.rb会恢复正常,我的数据库也会恢复正常。

然后我查看我的Schema.rb,我看到很多Spree表。

不仅如此,我还看到Schema.rb中的其他表格,我知道我已在spree分支中创建了一个迁移并“删除”。

因此,例如,我在orders中有一个Schema.rb表,我知道该表应该被删除。有点困惑,我决定创建一个新的迁移来删除orders表以及我在安装spree之前删除的其他表,并且我得到PG错误,表示该表不存在。

所以....现在看来,我的schema.rb和DB没有同步。

更糟糕的是,我的schema.rb和我的db/migrate文件夹没有同步。

我打算手工删除schema.rb中的create_table语句,用于那些不应该存在的表 - 但是这一切都很乱。

我如何从这个洞中挖掘自己,以后如何防止它?

摘要

DB

前狂欢状态

  • 表A
  • 表B
  • 表C

狂欢状态

  • 表A(已删除)
  • 表B(已删除)
  • 表C
  • Spree_Table_A
  • Spree_Table_B

疯狂后状态

  • 表A(已删除)
  • 表B(已删除)
  • 表C
  • Spree_Table_A
  • Spree_Table_B

基本上与狂欢状态

相同

数据库/迁移文件夹

前狂欢状态

  • 表A的迁移
  • 表B的迁移
  • 表C的迁移

狂欢状态

  • 迁移到删除表A
  • 迁移到删除表B
  • 表C的迁移
  • Spree_Table_A的迁移
  • Spree_Table_B的迁移

疯狂后状态

  • 表A的迁移
  • 表B的迁移
  • 表C的迁移

请注意,“Post-Spree State”的迁移不会与“Post-Spree State”的DB状态同步。

2 个答案:

答案 0 :(得分:1)

将评论转换为答案,因为它变得非常冗长:

为任何新分支建立单独的数据库更安全,即使它只是开发数据库的快照。您需要从狂欢分支恢复迁移(如果可能)并向下运行以使数据库返回到您拥有它的位置。

rake db:migrate VERSION=xxx 

xxx等于狂欢前最后一次迁移的数量

我不是git专家,但是如果你的分支是通过git删除的话,那么这个帖子可以帮助你恢复它。如果您只在本地删除它,那么您应该可以再次检查它。

Git: Recover deleted (remote) branch

答案 1 :(得分:1)

当您切换回develop分支时,git应该检查您的原始schema.rb(如果这还没有发生,我认为您应该重新检查git命令“#in}'使用)。但是,赢了会自动使您的数据库与创建spree时的位置保持一致。

如果您不再拥有所需的迁移文件以将您的数据库状态恢复为与您要退出git的提交相对应的状态,则应使用rake db:reset来使其匹配。这将转储数据库的当前状态并使用schema.rb重建它(然后应用相应的种子文件)。