针对代码版本测试和管理数据库版本
在开发应用程序数据库时,不可避免地会发生更改。我发现的技巧是使数据库构建与代码保持同步。过去,我添加了一个构建步骤,该构建步骤针对目标数据库执行了SQL脚本,但是这样做很危险,因为我们可能会无意中添加虚假数据或者更糟的数据。
我的问题是使数据库与代码保持一致的提示和技巧是什么?回滚代码怎么办?分枝?
解决方案
回答
数据库中嵌入的版本号很有帮助。我们有两种选择:将值嵌入可以查询的表中(允许对多个项目进行版本控制),或者可以测试具有明确命名的对象(例如表等)。
当我们投入生产时,如果发生意外灾难,我们是否有回滚计划?如果这样做,是架构回滚脚本的应用程序吗?使用回滚脚本将数据库回滚到以前的代码版本。
回答
You should be able to create your database from scratch into a known state.
尽管这样做是有帮助的(尤其是在新项目的早期阶段),但许多数据库(大多数?)很快就会变得太大而无法实现。另外,如果我们有任何BLOB,那么在为整个数据库生成SQL脚本时将遇到问题。
我肯定对某种数据库版本控制系统感兴趣,但是我还没有发现任何东西。因此,代替解决方案,我们会得到我的投票。 :-P
回答
我喜欢Django的工作方式。我们可以构建模型,并且在运行syncdb时,它将应用我们创建的模型。如果添加模型,则只需再次运行syncdb。每次进行推送时,让构建脚本执行都会很容易。
当我们需要更改已制成的表时,就会出现问题。我不认为syncdb可以解决这个问题。这将需要我们进入并手动添加表,还需要向模型添加属性。我们可能希望对alter statement进行版本控制。但是,这些模型将始终处于版本控制之下,因此,如果需要,我们可以在不运行sql脚本的情况下启动db模式并在新框上运行。与此相关的另一个问题是跟踪我们始终在数据库中需要的静态数据。
Rails迁移脚本也非常不错。
数据库版本控制系统会很棒,但是我真的不知道这件事。
回答
While being able to do so is helpful (especially in the early stages of a new project), many (most?) databases will quickly become far too large for that to be possible. Also, if you have any BLOBs then you're going to have problems generating SQL scripts for your entire database.
备份和压缩可以为我们提供帮助。抱歉,没有借口无法获得大量可用于开发的数据。即使只是子集。
回答
我们确实希望能够买到一台干净的机器,从源代码管理中获取最新版本,一步构建,然后一步运行所有测试。快速实现使我们可以更快地生产出优质的软件。
就像外部库一样,数据库配置也必须在源代码控制中。
请注意,我并不是说我们所有的实时数据库内容都应位于同一源代码管理中,仅足以达到干净状态。 (不过,请备份数据库内容!)
回答
在版本控制的文本文件中定义架构对象和参考数据。例如,我们可以使用Torque格式定义架构,并使用DBUnit格式定义数据(两者均使用XML)。然后,我们可以使用工具(我们编写了自己的工具)来生成DDL和DML,这些DDL和DML将我们从应用程序的一个版本迁移到另一个版本。我们的工具可以将(a)先前版本的架构和数据XML文件或者(b)现有数据库作为输入,因此我们始终能够使任何状态的数据库都进入正确的状态。
回答
将数据库开发置于版本控制之下。我建议看一下neXtep Designer:
http://www.nextep-softwares.com/wiki
它是一个免费的GPL产品,通过将版本信息与SQL生成引擎连接在一起,可以提供一种全新的数据库开发和部署方法,该SQL生成引擎可以自动计算将数据库的任何版本升级到另一个版本所需的任何升级脚本。任何现有数据库都可以通过反向同步进行版本控制。
它目前支持Oracle,MySql和PostgreSql。 DB2支持正在开发中。它是功能齐全的数据库开发环境,我们可以在其中始终处理存储库中版本控制的元素。我们可以在开发过程中通过简单的同步发布更新,也可以生成可导出的数据库交付,我们可以通过独立的安装程序在任何目标数据库上执行该安装程序,该安装程序可以验证版本,执行结构检查并应用升级脚本。
IDE还为我们提供SQL编辑器,依赖性管理,对模块化数据库模型组件,数据模型图,SQL客户端的支持等。
所有文档和概念都可以在Wiki中找到。