2009-09-26 84 views
4

我是一个在我工作的公司工作的单人乐队。我开发了一个Rails应用程序供公司内部使用。自项目开始以来,我使用SVN进行源代码管理,并完成了大部分(但不是全部)的主干开发。有时候,当我做出非常重大的改变时,我已经分支并且在完成时将改变合并回来。非常典型。管理同一台机器上不同分支机构的Rails迁移

但是,我所做的那些“重大变化”都没有涉及到数据库迁移。他们一直是视图/控制器的东西。

在这种情况下,如果使用一个开发框,我该如何处理迁移和各种数据库更改(我可能会或可能不会保留)?我不想记住在我将分支丢失之前将所有的迁移恢复回分支的开始。

我已经考虑建立特殊的开发环境和数据库(app_branch而不是app_development),但似乎强烈反对实验开发往往依赖的“简单分支”的概念。

这种情况是否有最佳做法?在这种情况下,其他人在做什么?

+0

伟大的问题。如果你不介意你的开发数据库一直都是空的(也许某些开发种子数据可能是按顺序的),那么你可以检出新的分支并运行'rake db:schema:load',这会摧毁开发并重建它来自当前的'db/schema.rb'。 – 2010-06-05 04:17:29

回答

1

那么,如果你想有不同的模式,你需要多个数据库。 “简单分支”通常指源代码管理,而不是数据库。据我所知,分支数据库并不是一种简单的方法,就像你会分支的那样,比如git。

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

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

development: 
    database: <% db %> 

注意,“production_database”是指在生产模式,而不是现场制作数据库的本地版本。

2

我努力让自己的开发数据库保持“可丢弃”状态。如果我失去了它 - 没什么大不了的。我的迁移已准备好从头开始构建它,并且总是有一个脚本,其中有种子/测试数据。我想这不是特别聪明。

如果我需要一个用于数据库工作的新分支,我只需检查它,删除,创建,耙取,然后种子。我想我会写一个脚本来完成它,因为当我开始建立分支时,我将不得不再次从主干进行相同的过程。

0

如果我创建一个分支,你正在siginificant更改,可以创建迁移然后更改database.yml中的development部分分支内之前创建数据库的副本。将您的:production部分放在一边,然后决定将分支合并回干线时要保留哪个版本的数据库以供将来开发。

我们用功能版本来做到这一点。我会为本地数据库提供版本1,2和3,如“db_v1”,db_v2“等。当我们浏览版本时,每个后续开发分支在database.yml中进行编辑,而树干停留在最新版本

+0

为什么?这是schema.rb已经做的,如果你正确使用它。 – 2011-06-15 22:27:30

+0

如果您愿意重新构建数据库,schema.rb可以帮助建立数据库的结构,但是如果您正在主动翻转分支机构,并且希望维护为每个分支机构建立的开发数据,那么它将无济于事。 – 2011-06-18 17:29:44

+0

“如果你愿意重建你的数据库” - 你为什么不去?这是正确的解决方案。开发数据应该是短暂的,但你总是可以使用yaml_db或者其他东西来导出你需要的东西,并在模式更改后重新加载它。 我可以想象出多个数据库,比如你在一个登台服务器上使用的地方,人们随机测试不同的版本(因此所有数据必须同时可用),但在你的本地开发机器上这样的设置表明你对自己的发展过程没有足够的控制力,结果导致你的生活更加艰难。 – 2011-06-20 15:43:35

2

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

此外,你真的应该切换到Git。这将使分支管理比SVN容易得多。 (我从两种程序都有很多经验。)

1

我写了一个脚本来处理这个确切的问题。它基于git的,但你可以很容易地改变它为SVN工作:

https://gist.github.com/4076864

给出一个分支名它将:

  1. 回滚该做的不是在你当前分支的任何迁移存在于给定的分支
  2. 丢弃任何新的迁移存在的DB/schema.rb文件
  3. 退房给定的分支
  4. 运行的任何变化荷兰国际集团在给定的分支
  5. 更新您的测试数据库

我发现自己做手工这一切的时候在我们的项目,所以我认为这会是不错的自动化过程。

相关问题