你如何版本数据库模式?

你如何准备你的SQL增量? 你是否手动将每个模式更改的SQL保存到增量文件夹,或者是否有某种自动化的比较过程?

我对版本化数据库模式和源代码的习惯感兴趣。 也许是一个预先提交的钩子不同的架构?

另外,除了DbDeploy之外,还有什么选项可以用来区分差异 ?

编辑:看到答案我想澄清,我熟悉使用deltas运行数据库迁移的标准scheme。 我的问题是关于自己创build三angular洲,最好是自动创build。

另外,版本控制是为了PHP和MySQL,如果它有所作为。 (请不要Ruby解决scheme)。

看到

是否有数据库结构更改的版本控制系统?

我如何版本我的MS SQL数据库在SVN?

和杰夫的文章

在版本控制下获取数据库

我感到你的痛苦,我希望有一个更好的答案。 这可能更接近你正在寻找的东西。

跟踪数据库模式更改的机制

一般来说,我觉得没有足够的,可以接受的解决办法,而且我在这方面也是自己做的。

您可以看看另一个类似的线程: 如何在SVN中版本化我的MS SQL数据库? 。

如果你仍然在寻找select:看看neXtep的devise师。 它是基于版本控制概念的免费GPL数据库开发环境。 在这个环境中,您始终使用版本化实体,并可以专注于数据模型开发。 一旦发布完成,版本控制系统上插入的SQL生成引擎就可以在两个版本之间生成任何需要的增量,并且如果需要的话可以为您提供一些递送机制。

除此之外,您可以在开发过程中同步和反向同步数据库,创build数据模型图,使用集成SQL客户端查询数据库等。

看看维基的更多信息: http : //www.nextep-softwares.com/wiki

它目前支持Oracle,MySql和PostgreSql,并且使用java,因此该产品可以在Windows,Linux和Mac上运行。

我不pipe理三angular洲。 我对主数据库进行了更改,并有一个基于主数据库创build基于XML的生成脚本的工具。

当升级现有的数据库时,我有一个程序使用基于XML的构build脚本来创build一个新的数据库和裸表。 然后使用INSERT INTO x SELECT FROM y从旧数据库中复制数据,然后应用所有索引,约束和触发器。

新的表,新的列,删除的列都自动处理,并用一些小的技巧来调整复制例程,我可以处理列重命名,列types更改和其他基本的重构。

我不会推荐这个解决scheme在数据量很大的数据库上,但是我经常用400个表更新一个超过1GB的数据库。

你没有提到你正在使用哪个RDBMS,但是如果它是MS SQL Server的话,Red-Gate的SQL Compare对于我们创build对象创build脚本之间的增量是不可或缺的。

我并不是一个人,但我已经开发了一个内部的Web应用程序来跟踪数据库模式的变化并创build版本化的更新脚本。

这个工具被称为巴西 ,现在是MIT许可下的开源软件。 巴西是基于rails的ruby / ruby​​,并支持对Ruby DBI支持的任何数据库(MySQL,ODBC,Oracle,Postgres,SQLite)进行更改部署。

计划在版本控制中支持更新脚本。

http://bitbucket.org/idler/mmp – 用于mysql的模式版本控制工具,用PHP编写

我确定模式更改总是附加的。 所以我不删除列和表,因为那样会拖动数据,以后不能回滚。 这样,使用数据库的代码就可以回滚,而不会丢失数据或function。

我有一个包含语句的迁移脚本,这些语句创build表和列(如果它们尚不存在并用数据填充它们)。

迁移脚本在生产代码更新和新安装后运行。

当我想删除一些东西的时候,通过从数据库安装脚本和迁移脚本中删除它们来完成,所以这些过时的模式元素将在新安装中被逐渐淘汰。 缺点是新安装在安装之前无法降级到较旧的版本。

当然,我通过这些脚本执行DDL,而不是直接在数据库上保持同步。

我们正在将数据导出为便携式格式(使用我们的工具链),然后将其导入新的模式。 不需要增量SQL。 强烈推荐。

我使用Firebird数据库进行大多数开发,并使用FlameRobinpipe理工具。 它有一个很好的选项来logging所有的变化。 它可以将一切logging到一个大文件,或者每个数据库更改一个文件。 我使用第二个选项,然后将每个脚本存储在版本控制软件中 – 早些时候我使用Subversion,现在我使用Git。

我假设你可以find一些像FlameRobin一样的日志loggingfunction的MySQL工具。

在其中一个数据库表中,我存储了数据库结构的版本号 ,所以我可以很容易地升级任何数据库。 我还写了一个简单的PHP脚本,可以在任何目标数据库(命令行提供数据库path和用户名/密码)上逐一执行这些SQL脚本。

还有一个选项可以logging所有DML(插入,更新删除)语句,并且在修改每个数据库包含的一些“默认”数据时激活这个选项。

我写了一篇很好的白皮书,详细介绍了如何做到这一点。 您可以从这里下载PDF格式的文件以及演示PHP脚本。

我还开发了一套PHP脚本,开发人员可以将它们的deltasql脚本提交到中央存储库。

在其中一个数据库表(名为TBSYNCHRONIZE)中,我存储了最新执行的脚本的版本号,所以我可以使用Web界面或专门为Eclipse开发的客户端轻松升级任何数据库。

Web界面允许pipe理多个项目。 它也支持数据库“分支”。

您可以在http://www.gpu-grid.net/deltasql上testing应用程序(如果您使用密码testdbsync以pipe理员身份login)。; 该应用程序是开源的,可以在这里下载: http : //sourceforge.net/projects/deltasql

deltasql在瑞士和印度被有效地使用,在日本很stream行。

几个月前,我search工具的MySQL模式版本。 我发现了许多有用的工具,如Doctrine迁移,RoR迁移,一些用Java和Python编写的工具。

但没有一个人满意我的要求。

我的要求:

  1. 没有要求,排除PHP和MySQL
  2. 没有模式configuration文件,像Doctrine中的schema.yml
  3. 能够从连接读取当前模式并创build新的迁移脚本,而不是在其他应用程序安装中表示相同的模式。

我开始写我的迁移工具,今天我有testing版本。

请尝试一下,如果你对这个话题感兴趣的话。 请寄给我未来的请求和错误报告。

源代码:bitbucket.org/idler/mmp/src英文概述:bitbucket.org/idler/mmp/wiki/Home俄文概述:antonoff.info/development/mysql-migration-with-php-project

我也对这个话题感兴趣。

在Django维基上有一些关于这个主题的讨论 。

有趣的是,它看起来像CakePHP具有架构版本化内置使用cake schema generate命令。

对于MySQL

当我登陆一个新的DB时:

首先,我检查结构:

 mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt cat DIFF_FILENAME.txt | less 

感谢stackoverflow用户,我可以编写这个快速脚本来查找结构的差异。

src: https : //stackoverflow.com/a/8718572/4457531&https : //stackoverflow.com/a/26328331/4457531

第二步,我用mysqldiff检查数据表。 这有点陈旧,但是基于information_schema数据的php循环确实能够确保工作

对于版本控制,我使用相同的方式,但我使用差异结果格式化SQL更新脚本(升级或回滚),并使用版本号约定(几个修改版本号看起来像一个IP地址)

 initial version : 1.0.0 ^ ^ ^ | | | structure change: - | | datas added: -------- | datas updated: -------- 

我正在使用严格的数据库模式版本(在单独的表中跟踪)。 脚本存储在版本控制中,但在进行任何更改之前都会validation当前的模式版本。

下面是SQL Server的完整实现(如果需要,可以为MySQL开发相同的解决scheme): 如何维护SQL Server数据库模式版本

经过长时间的调查,我发现有一些第三方工具或Visual Studio项目types不能满足我,或者只是关于理论的博客,但没有实现。 所以我实现了一个使用了近一年的工作系统,并在这里解释:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

根据兴趣,将继续写更多。