Mechanisms for tracking DB schema changes跟踪和/或自动执行数据库架构更改的最佳方法是什么?我们的团队使用Subversion进行版本控制,并且我们已经能够以这种方式自动执行一些任务(将构建推送到登台服务器,将经过测试的代码部署到生产服务器),但是我们仍在手动进行数据库更新。我想找到或创建一个解决方案,使我们能够在具有不同环境的服务器之间高效地工作,同时继续使用Subversion作为后端,通过该后端代码和数据库更新被推送到各种服务器。 许多流行的软件包都包括自动更新脚本,该脚本可检测数据库版本并应用必要的更改。这是否是在更大范围内(跨多个项目,有时跨多种环境和语言)执行此操作的最佳方法?如果是这样,是否有任何现有代码可以简化流程,或者最好只是推出我们自己的解决方案?之前有没有人实现过类似的东西并将其集成到Subversion提交后钩子中,还是一个坏主意? 虽然支持多个平台的解决方案是更可取的,但是我们绝大部分需要在该平台上支持Linux / Apache / MySQL / PHP堆栈。 在Rails世界中,存在迁移的概念,即脚本,其中对数据库的更改是使用Ruby而不是特定于数据库的SQL风格进行的。您的Ruby迁移代码最终将转换为特定于您当前数据库的DDL。这使得切换数据库平台非常容易。 对于您对数据库所做的每一次更改,您都要编写一个新的迁移。迁移通常有两种方法:应用更改的"上"方法和撤消更改的"下"方法。单个命令可以使数据库更新,也可以用于将数据库带到架构的特定版本。在Rails中,迁移与项目其他代码一样,都保存在项目目录中自己的目录中,并被检入版本控制中。 该Oracle Rails迁移指南很好地介绍了迁移。 使用其他语言的开发人员已经研究了迁移并实现了自己的特定于语言的版本。我知道Ruckusing是一个以Rails的迁移为模型的PHP迁移系统。这可能是您要寻找的。 我们使用类似于bcwoord的方法来保持数据库模式在5个不同的安装(生产,暂存和一些开发安装)之间同步,并在版本控制中进行备份,并且效果很好。我会详细说明: 为了同步数据库结构,我们有一个脚本update.php和许多编号为1.sql,2.sql,3.sql等的文件。该脚本使用一个额外的表来存储数据库的当前版本号。数据库。 N.sql文件是手工制作的,以从数据库的版本(N-1)升级到版本N。 它们可用于添加表,添加列,将数据从旧的格式迁移到新的列格式,然后删除列,插入"主"数据行(例如用户类型)等。基本上,它可以执行任何操作并使用适当的数据迁移脚本,您将永远不会丢失数据。 更新脚本的工作方式如下:
一切都进入源代码控制,并且每个安装都有一个脚本,可通过一次脚本执行将脚本更新到最新版本(使用正确的数据库密码调用update.php等)。我们通过自动调用数据库更新脚本的脚本来SVN更新登台和生产环境,因此代码更新随附必需的数据库更新。 我们还可以使用相同的脚本从头开始创建整个数据库。我们只是删除并重新创建数据库,然后运行将完全重新填充数据库的脚本。我们还可以使用脚本填充空数据库以进行自动测试。 设置该系统仅花费了几个小时,从概念上讲它很简单,每个人都可以使用版本编号方案,并且它具有前进和发展数据库设计的能力,而无需沟通或手动执行修改,这是无价的。在所有数据库上。
但是当从phpMyAdmin粘贴查询时要当心!这些生成的查询通常包含数据库名称,您肯定不希望使用该数据库名称,因为它会破坏脚本!如果系统上的数据库未称为mydb,则CREATE TABLE 我的团队编写了所有数据库更改的脚本,并将这些脚本以及应用程序的每个版本提交给SVN。这允许增量更改数据库,而不会丢失任何数据。 要从一个发行版过渡到另一个发行版,您只需要运行一组更改脚本,并且数据库是最新的,您仍然可以获得所有数据。它可能不是最简单的方法,但绝对有效。 如果您仍在寻找解决方案:我们建议使用一种名为neXtep designer的工具。这是一个数据库开发环境,您可以使用该环境将整个数据库置于版本控制之下。您在版本控制的存储库上工作,可以跟踪每个更改。 当需要发布更新时,您可以提交组件,产品将自动从先前版本生成SQL升级脚本。当然,您可以从任意两个版本生成此SQL。 然后,您有很多选择:您可以将这些脚本与应用程序代码一起放入SVN中,以便通过现有机制进行部署。另一个选择是使用neXtep的传递机制:脚本以"传递包"(SQL脚本+ XML描述符)的形式导出,安装程序可以理解此包并将其部署到目标服务器,同时确保结构一致性,依赖性检查,注册已安装的版本等。
该产品是GPL,基于Eclipse,因此可以在Linux,Mac和Windows上运行。目前它还支持Oracle,Mysql和Postgresql(正在支持DB2)。查看Wiki,您将在其中找到更多详细信息:
真正的问题是,开发人员可以轻松地将自己的本地更改编写到源代码管理中,以便与团队共享。我已经面对这个问题很多年了,并且受到Visual Studio for Database专业人士功能的启发。如果您想要具有相同功能的开源工具,请尝试以下操作:http://dbsourcetools.codeplex.com/ 将模式转储到文件中,并将其添加到源代码管理中。然后一个简单的差异将告诉您发生了什么变化。 Scott Ambler撰写了大量有关数据库重构的文章(并与人合着),其思想是您应实质上将TDD原理和实践应用于维护架构。您为数据库设置了一系列结构和种子数据单元测试。然后,在您进行任何更改之前,您都要修改/编写测试以反映该更改。 我们已经这样做了一段时间了,而且似乎可行。我们编写了在单元测试套件中生成基本列名和数据类型检查的代码。我们可以随时重新运行这些测试,以验证SVN检出中的数据库是否与应用程序实际运行的实时数据库匹配。 事实证明,开发人员有时还会调整其沙箱数据库,而忽略了更新SVN中的架构文件。然后,代码取决于尚未签入的数据库更改。这种错误很难确定,但是测试套件会立即将其修复。如果您将其内置到较大的持续集成计划中,则特别好。 K. Scott Allen撰写了一篇有关架构版本的不错的文章,其中使用了本文其他答案中引用的增量更新脚本/迁移概念;参见http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx。 这是一项低技术,可能会有更好的解决方案,但是您可以将架构存储在可以运行以创建数据库的SQL脚本中。我认为您可以执行命令来生成此脚本,但是不幸的是我不知道该命令。 然后,将脚本及其上的代码提交到源代码管理中。当您需要与代码一起更改模式时,可以将脚本与需要更改的模式的代码一起检入。然后,脚本上的差异将指示架构更改上的差异。 使用此脚本,您可以将其与DBUnit或某种构建脚本集成,因此看来它可以与您已经自动化的流程配合使用。 我在Visual Studio中将以下数据库项目结构用于多个项目,并且效果很好: 数据库
|