7

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

我的问题是使数据库与代码保持同步的提示和技巧是什么?当你回滚代码时呢?分枝?

4

7 回答 7

3

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

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

于 2008-08-28T23:38:10.893 回答
1

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

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

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

于 2008-08-28T23:45:32.063 回答
1

您确实希望能够使用一台干净的机器,从源代码管理中获取最新版本,一步构建,一步运行所有测试。加快速度可以让您更快地生产出好的软件。

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

请注意,我并不是说您的所有实时数据库内容都应该在同一个源代码管理中,这足以达到干净的状态。(不过,请备份您的数据库内容!)

于 2008-09-13T20:38:25.187 回答
1

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

于 2009-09-04T06:36:28.237 回答
0

我喜欢 Django 的做法。您构建模型,当您运行 syncdb 时,它会应用您创建的模型。如果你添加一个模型,你只需要再次运行 syncdb。每次推送时都可以轻松地让构建脚本执行此操作。

当您需要更改已经制作的表格时,问题就来了。我不认为 syncdb 可以处理这个问题。这将需要您进入并手动添加表格,并向模型添加一个属性。您可能希望对该 alter 语句进行版本控制。不过,这些模型将始终处于版本控制之下,因此如果您需要,您可以在不运行 sql 脚本的情况下在新机器上启动并运行 db 模式。另一个问题是跟踪数据库中您一直想要的静态数据。

Rails 迁移脚本也很不错。

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

于 2008-08-29T00:15:26.890 回答
0

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

备份和压缩可以帮助您。抱歉 - 没有理由不能够获得一组好的数据来进行开发。即使它只是一个子集。

于 2008-08-29T08:51:02.437 回答
0

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

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

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

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

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

于 2010-10-23T09:00:30.647 回答