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

问题描述:

在开发应用程序数据库时,不可避免地会弹出变化。我发现的诀窍是保持您的数据库与您的代码一致。在过去,我添加了一个构建步骤,可以针对目标数据库执行SQL脚本,但这样做会非常危险,因为您可能会无意中添加虚假数据或更糟。根据代码版本测试和管理数据库版本

我的问题是保持数据库与代码一致的提示和技巧是什么?如何回滚代码?分枝?

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

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

您应该可以从头创建数据库到已知状态。

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

我一定对某种数据库版本控制系统感兴趣,但是我还没有找到任何东西。所以,而不是一个解决方案,你会得到我的投票。 :-P

+1

我不同意。您只需*能够测试数据库的工作副本。您必须通过安全措施对生产进行测试,或者让您的管理层为更大的测试服务器提供现金。 – 2009-10-06 11:01:48

我喜欢Django做它的方式。您可以构建模型,并在运行syncdb时应用您创建的模型。如果你添加一个模型,你只需要再次运行syncdb。每次你推动你的构建脚本时,这很容易。

当您需要更改已经创建的表时,会出现问题。我不认为syncdb处理。这将需要你进入并手动添加表格,并添加一个属性到模型中。您可能想要对该更改语句进行版本化。尽管这些模型总是处于版本控制之下,所以如果您需要的话,您可以在不运行sql脚本的情况下在一个新框中启动并运行数据库模式。与此相关的另一个问题是跟踪您始终想要在数据库中使用的静态数据。

Rails迁移脚本也很不错。

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

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

备份和压缩可以帮助你。对不起 - 没有任何借口不能获得一组好的数据来开发。即使它只是一个子集。

您确实希望能够使用干净的机器,从源代码管理中获取最新版本,一步构建,并且一步完成所有测试。快速实现这一点使您可以更快地生成优质软件

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

请注意,我不是说你的所有活动数据库内容应该在同一个源代码管理中,只需要达到一个干净的状态。 (请备份数据库内容!)

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

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

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

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

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

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