根据代码版本测试和管理数据库版本

时间:2008-08-28 23:30:17

标签: database version-control testing build-process

在开发应用程序数据库时,不可避免地会弹出更改。我发现的技巧是使您的数据库与代码保持同步。在过去,我添加了一个针对目标数据库执行SQL脚本的构建步骤,但这很危险,因为您可能无意中添加虚假数据或更糟。

我的问题是让数据库与代码保持同步的提示和技巧是什么?回滚代码时怎么办?分支?

7 个答案:

答案 0 :(得分:3)

数据库中嵌入的版本号很有帮助。您有两种选择,将值嵌入到可以查询的表中(允许对多个项进行版本控制),或者具有可以测试的明确命名的对象(例如表或某些项)。

当您发布到生产时,您是否在发生意外灾难时有回滚计划?如果这样做,是应用模式回滚脚本吗?使用回滚脚本将数据库回滚到以前的代码版本。

答案 1 :(得分:1)

  

您应该能够从头开始创建数据库到已知状态。

虽然能够这样做很有帮助(特别是在新项目的早期阶段),许多(大多数?)数据库很快就会变得太大而无法实现。此外,如果您有任何BLOB,那么您将在为整个数据库生成SQL脚本时遇到问题。

我肯定对某种数据库版本系统感兴趣,但我还没有找到任何东西。因此,您将获得我的投票,而不是解决方案。 :-P

答案 2 :(得分:1)

您确实希望能够使用干净的机器,从源代码控制中获取最新版本,一步构建,并一步完成所有测试。快速制作可以让您更快地制作出更好的软件。

就像external libraries一样,数据库配置也必须在源代码管理中。

请注意,我并不是说您的所有实时数据库内容应该位于同一个源代码控制中,只是足以达到干净状态。 (但是,请备份您的数据库内容!)

答案 3 :(得分:1)

在版本控制的文本文件中定义架构对象和参考数据。例如,您可以以Torque格式定义架构,以DBUnit格式定义数据(均使用XML)。然后,您可以使用工具(我们编写自己的工具)来生成DDL和DML,从您的应用程序的一个版本到另一个版本。我们的工具可以作为输入(a)以前版本的架构&数据XML文件或(b)现有数据库,因此您始终能够将任何状态的数据库置于正确的状态。

答案 4 :(得分:0)

我喜欢Django的做法。您构建模型,当您运行syncdb时,它会应用您创建的模型。如果添加模型,则只需再次运行syncdb。每次推送时,您的构建脚本都很容易。

当您需要更改已经创建的表时,问题就出现了。我认为syncdb不会处理这个问题。这将要求您进入并手动添加表格,并向模型添加属性。您可能希望对该alter语进行版本控制。虽然模型总是受版本控制,所以如果你需要,你可以在不运行sql脚本的情况下在新盒子上运行db模式。另一个问题是跟踪数据库中您一直想要的静态数据。

Rails迁移脚本也很不错。

数据库版本控制系统会很棒,但我真的不知道这样的事情。

答案 5 :(得分:0)

  

虽然能够这样做很有帮助(特别是在新项目的早期阶段),许多(大多数?)数据库很快就会变得太大而无法实现。此外,如果您有任何BLOB,那么您将在为整个数据库生成SQL脚本时遇到问题。

备份和压缩可以帮助您。对不起 - 没有理由不能得到一套好的数据来开发。即使它只是一个子集。

答案 6 :(得分:0)

将您的数据库开发置于版本控制之下。我建议看看neXtep设计师: http://www.nextep-softwares.com/wiki

这是一款免费的GPL产品,它通过将版本信息与SQL生成引擎相连接,为数据库开发和部署提供了一种全新的方法,该引擎可以自动计算将任何版本的数据库升级到另一个版本所需的任何升级脚本。任何现有数据库都可以通过反向同步进行版本控制。

它目前支持Oracle,MySql和PostgreSql。 DB2支持正在开发中。它是一个功能齐全的数据库开发环境,您始终可以从存储库中处理版本控制的元素。您可以在开发期间通过简单同步发布更新,并且可以生成可导出的数据库交付,您可以通过独立安装程序在任何目标数据库上执行该安装,该安装程序验证版本,执行结构检查并应用升级脚本。

IDE还为您提供SQL编辑器,依赖关系管理,对模块化数据库模型组件的支持,数据模型图,SQL客户端等等。

所有文档和概念都可以在维基中找到。