6

在我工作的公司里,我是一个单人乐队。我开发了一个 Rails 应用程序供公司内部使用。自项目开始以来,我一直使用 SVN 进行源代码控制,并在主干中完成了大部分但不是全部的开发。有时,当我要进行非常重大的更改时,我会分支并在完成后将更改合并回来。都很典型。

然而,我必须做出的那些“重大改变”都没有触及数据库迁移。它们一直是视图/控制器的东西。

在这种情况下,使用一个开发框,我如何处理迁移和我可能保留或可能不保留的各种数据库更改?如果分支不起作用,我不想记住将所有迁移恢复到分支的开头,然后再将其丢弃。

我考虑过设置特殊的开发环境和数据库(app_branch而不是app_development),但这似乎与实验开发倾向于依赖的“简单分支”的概念背道而驰。

这种情况有最佳实践吗?在这种情况下,其他人在做什么?

4

5 回答 5

2

我努力保持我的开发数据库“可删除”。如果我失去了这一切 - 没什么大不了的。我的迁移已准备好从头开始重新构建它,并且在某处总是有一个带有种子/测试数据的脚本。我想这不是特别聪明。

如果我需要一个用于数据库工作的新分支,我只需检查它、删除、创建、rake,然后播种。我想我会写一个脚本来完成它,因为当我去放弃分支时,我将不得不从主干再次经历相同的过程。

于 2010-12-29T22:46:58.650 回答
2

确保您的 schema.rb 文件在版本控制中。这样,当您切换分支时,您可以删除您的数据库,然后根据需要执行 rake db:schema:load。

另外,你真的应该切换到 Git。它将使分支管理比 SVN 容易得多。(我从这两个程序的大量经验中发言。)

于 2011-04-29T18:01:40.923 回答
1

好吧,如果你想拥有不同的模式,你将需要多个数据库。“轻松分支”通常是指源代码控制,而不是数据库。据我所知,没有像在 git 中那样分支数据库的简单方法。

我们管理我们的开发/生产分支的一件事是我们在 database.yml 文件中检查我们当前的 git 分支。如果当前分支是生产,我们使用一个数据库,否则我们使用我们的开发数据库。类似这样的东西:

<% if 'git branch' =~ /^\* production/
    db = 'production_database'
   else
    db = 'development_database
end %>

development:
    database: <% db %>

请注意,“production_database”指的是生产模式的本地版本,而不是实时生产数据库。

于 2009-09-26T04:42:38.217 回答
1

我写了一个脚本来处理这个确切的问题。它基于 git,但您可以轻松地将其更改为适用于 svn:

https://gist.github.com/4076864

给定一个分支名称,它将:

  1. 回滚当前分支上给定分支上不存在的任何迁移
  2. 放弃对 db/schema.rb 文件的任何更改
  3. 查看给定的分支
  4. 运行给定分支中存在的任何新迁移
  5. 更新您的测试数据库

我发现自己一直在我们的项目中手动执行此操作,因此我认为自动化该过程会很好。

于 2012-11-15T07:03:37.667 回答
0

如果我正在创建一个您要进行重大更改的分支,您可以在创建迁移之前创建数据库的副本,然后更改development分支内的 database.yml 部分。不理会您的:production部分,然后在将分支合并回主干时决定要保留哪个版本的数据库以供将来开发。

我们通过功能发布来做到这一点。我将拥有版本 1、2、3 的本地数据库,例如“db_v1”、db_v2 等。当我们遍历这些版本时,每个后续开发分支都会进行编辑,database.yml而主干则保留在最后一个版本上以进行错误修复。

于 2011-03-12T20:35:28.580 回答