测试和管理数据库版本与代码版本的对应关系

7

在开发应用程序时,数据库变更不可避免。我发现的诀窍是将数据库构建与代码保持同步。过去,我添加了一个构建步骤,针对目标数据库执行SQL脚本,但这样做很危险,因为您可能会意外地添加虚假数据或更糟糕的情况。

我的问题是如何保持数据库与代码同步?如果回滚代码怎么办?分支呢?

7个回答

3

在数据库中嵌入版本号是很有帮助的。您有两个选择:将值嵌入到可以查询的表中(允许对多个项目进行版本控制),或者使用显式命名的对象(例如表格等)进行测试。

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


1

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


1
你应该能够从头开始创建数据库并将其转换为已知状态。
虽然这样做很有帮助(特别是在新项目的早期阶段),但许多(大多数?)数据库很快就会变得过于庞大,以至于不可能这样做。此外,如果您有任何BLOB,则生成整个数据库的SQL脚本将会出现问题。
我确实对某种DB版本控制系统感兴趣,但我还没有找到任何东西。因此,除了投票之外,您将得不到解决方案。 :-P

1
我不同意。你必须能够针对数据库的工作副本进行测试。你要么必须在生产环境中采取保障措施进行测试,要么让管理层拨款购买更大的测试服务器。 - Iain Holder

1

你真的想要能够从源代码控制中获取最新版本,一步构建并一步运行所有测试。使这个过程快速化可以让你更快地生产出优秀的软件。

就像外部库一样,数据库配置也必须在源代码控制中。

请注意,我并不是说你所有的实时数据库内容都应该在同一个源代码控制中,只需要足够达到干净状态即可。(但务必备份数据库内容!)


0

将您的数据库开发放在版本控制下。我建议您看一下neXtep designer: http://www.nextep-softwares.com/wiki

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

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

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

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


0

我喜欢Django的方式。你可以构建模型,当你运行syncdb时,它会应用你创建的模型。如果你添加了一个模型,你只需要再次运行syncdb即可。这样每次推送时,你的构建脚本都可以轻松完成。

问题在于,当你需要修改已经存在的表时,syncdb无法处理。这将要求你手动添加表并向模型添加属性。你可能想要对该修改语句进行版本控制。虽然模型始终处于版本控制下,但另一个问题是跟踪你始终希望在数据库中保留的静态数据。

Rails迁移脚本也很不错。

一个数据库版本控制系统会很棒,但我真的不知道有这样的东西。


0
尽管有能力这样做很有帮助(特别是在新项目的早期阶段),但许多数据库(大多数?)很快就会变得过于庞大,以至于不可能实现。此外,如果你有任何 BLOBs,则为整个数据库生成 SQL 脚本将会遇到问题。
备份和压缩可以帮助你解决这个问题。抱歉 - 没有理由不能获得一组良好的数据来进行开发。即使只是子集。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接