在开发应用程序时,数据库变更不可避免。我发现的诀窍是将数据库构建与代码保持同步。过去,我添加了一个构建步骤,针对目标数据库执行SQL脚本,但这样做很危险,因为您可能会意外地添加虚假数据或更糟糕的情况。
我的问题是如何保持数据库与代码同步?如果回滚代码怎么办?分支呢?
在开发应用程序时,数据库变更不可避免。我发现的诀窍是将数据库构建与代码保持同步。过去,我添加了一个构建步骤,针对目标数据库执行SQL脚本,但这样做很危险,因为您可能会意外地添加虚假数据或更糟糕的情况。
我的问题是如何保持数据库与代码同步?如果回滚代码怎么办?分支呢?
在数据库中嵌入版本号是很有帮助的。您有两个选择:将值嵌入到可以查询的表中(允许对多个项目进行版本控制),或者使用显式命名的对象(例如表格等)进行测试。
当您发布到生产环境时,如果出现意外灾难,您是否有回滚计划?如果有,它是应用模式回滚脚本吗?使用回滚脚本将数据库回滚到先前的代码版本。
你真的想要能够从源代码控制中获取最新版本,一步构建并一步运行所有测试。使这个过程快速化可以让你更快地生产出优秀的软件。
就像外部库一样,数据库配置也必须在源代码控制中。
请注意,我并不是说你所有的实时数据库内容都应该在同一个源代码控制中,只需要足够达到干净状态即可。(但务必备份数据库内容!)
将您的数据库开发放在版本控制下。我建议您看一下neXtep designer: http://www.nextep-softwares.com/wiki
这是一个免费的GPL产品,通过将版本信息与SQL生成引擎连接起来,提供了全新的数据库开发和部署方法,可以自动计算升级脚本,以便将数据库的任何版本升级到另一个版本。通过反向同步,可以对任何现有的数据库进行版本控制。
它目前支持Oracle、MySql和PostgreSql。DB2支持正在开发中。它是一个功能齐全的数据库开发环境,您始终从存储库中使用版本控制元素进行工作。在开发过程中,您可以通过简单的同步发布更新,并生成可导出的数据库交付项,您可以通过独立安装程序在任何目标数据库上执行这些交付项,该安装程序验证版本、执行结构检查并应用升级脚本。
IDE还为您提供SQL编辑器、依赖关系管理、支持模块化数据库模型组件、数据模型图、SQL客户端等等。
所有文档和概念都可以在wiki中找到。
我喜欢Django的方式。你可以构建模型,当你运行syncdb时,它会应用你创建的模型。如果你添加了一个模型,你只需要再次运行syncdb即可。这样每次推送时,你的构建脚本都可以轻松完成。
问题在于,当你需要修改已经存在的表时,syncdb无法处理。这将要求你手动添加表并向模型添加属性。你可能想要对该修改语句进行版本控制。虽然模型始终处于版本控制下,但另一个问题是跟踪你始终希望在数据库中保留的静态数据。
Rails迁移脚本也很不错。
一个数据库版本控制系统会很棒,但我真的不知道有这样的东西。