你如何准备你的SQL增量?您是否手动将每个架构更改SQL保存到增量文件夹,或者您是否有某种自动化的差异化过程?
我对版本化数据库模式以及源代码的约定感兴趣 . 也许是一个预先提交的钩子来区分架构?
此外,除了DbDeploy之外还存在哪些差异增长的选项?
EDIT: 看到答案我想澄清一点,我熟悉使用增量运行数据库迁移的标准方案 . 我的问题是关于自己创建增量,最好是自动创建增量 .
此外,版本控制适用于PHP和MySQL,如果它有所作为 . (请不要使用Ruby解决方案) .
如果你还在寻找选择:看看neXtep设计师 . 它是基于版本控制概念的免费GPL数据库开发环境 . 在环境中,您始终使用版本化实体,并且可以专注于数据模型开发 . 发布完成后,插入版本控制系统的SQL生成引擎可以生成两个版本之间所需的任何增量,并在需要时为您提供一些传送机制 .
除此之外,您还可以在开发期间同步和反向同步数据库,创建数据模型图,使用集成的SQL客户端查询数据库等 .
有关更多信息,请查看Wiki:http://www.nextep-softwares.com/wiki
它目前支持Oracle,MySql和PostgreSql,并且在java中,因此该产品可以在windows,linux和mac上运行 .
看到
Is there a version control system for database structure changes?
How do I version my MS SQL database in SVN?
和杰夫的文章
Get Your Database Under Version Control
我感觉到你的痛苦,我希望有更好的答案 . 这可能更接近你想要的 .
Mechanisms for tracking DB schema changes
一般来说,我觉得没有足够的,可接受的解决方案,我在这个领域自己动手 .
你可以看看另一个类似的线程:How do I version my MS SQL database in SVN? .
我确保架构更改始终是附加的 . 所以我不删除列和表,因为这会消除数据并且以后无法回滚 . 这样,可以回滚使用数据库的代码,而不会丢失数据或功能 .
我有一个迁移脚本,其中包含创建表和列的语句(如果它们尚不存在)并用数据填充它们 .
每当 生产环境 代码更新时和新安装后,迁移脚本都会运行 .
当我想删除某些内容时,我会从数据库安装脚本和迁移脚本中删除它们,以便在新安装中逐步淘汰这些过时的架构元素 . 缺点是新安装在安装之前无法降级到旧版本 .
当然,我通过这些脚本执行DDL,而不是直接在数据库上执行以保持同步 .
我没有管理增量 . 我对master数据库进行了更改,并拥有一个基于master数据库创建基于XML的构建脚本的工具 .
当升级现有数据库时,我有一个程序,它使用基于XML的构建脚本来创建新数据库和裸表 . 然后,我使用INSERT INTO x SELECT FROM y从旧数据库复制数据,然后应用所有索引,约束和触发器 .
新表,新列,删除列都会自动处理,并使用一些小技巧来调整复制例程,我可以处理列重命名,列类型更改和其他基本重构 .
我不建议在具有大量数据的数据库上使用此解决方案,但我会定期使用400个表更新超过1GB的数据库 .
你没有使用't mention which RDBMS you',但是如果它在我们创建对象创建脚本之间的增量时是必不可少的 .
我不是一个自己的角,但我开发了一个内部Web应用程序来跟踪数据库模式的更改并创建版本化的更新脚本 .
此工具名为Brazil,现在是MIT许可下的开源 . 巴西是基于rails的ruby / ruby,支持更改部署到任何支持的数据库(MySQL,ODBC,Oracle,Postgres,SQLite) .
计划支持将更新脚本置于版本控制中 .
http://bitbucket.org/idler/mmp - 用于mysql的模式版本控制工具,用PHP编写
我们将数据导出为可移植格式(使用我们的工具链),然后将其导入新架构 . 不需要delta SQL . 强烈推荐 .
我用Firebird数据库用于大多数开发,我使用FlameRobin管理工具 . 它有一个很好的选项来记录所有更改 . 它可以将所有内容记录到一个大文件中,或者每个数据库更改一个文件 . 我使用第二个选项,然后我将每个脚本存储在版本控制软件中 - 之前我使用过Subversion,现在我使用Git .
我假设您可以找到一些具有相同日志记录功能的MySQL工具,如FlameRobin为Firebird所做的那样 .
在其中一个数据库表中,我存储了数据库结构的版本号,因此我可以轻松地升级任何数据库 . 我还写了一个简单的PHP脚本,它在任何目标数据库上逐个执行这些SQL脚本(命令行提供了数据库路径和用户名/密码) .
还可以选择记录所有DML(插入,更新删除)语句,并在修改每个数据库包含的某些“默认”数据时激活它 .
我写了一篇很好的白皮书,详细介绍了我如何做到这一切 . 您可以下载.pdf格式的文件以及来自here的演示PHP脚本 .
我还开发了一组PHP脚本,开发人员可以将他们的deltasql脚本提交到中央存储库 .
在其中一个数据库表(称为TBSYNCHRONIZE)中,我存储了最新执行脚本的版本号,因此我可以使用Web界面或专门为Eclipse开发的客户端轻松升级任何数据库 .
Web界面允许管理多个项目 . 它还支持数据库“分支” .
您可以在http://www.gpu-grid.net/deltasql测试应用程序(如果您使用密码testdbsync以管理员身份登录) . 该应用程序是开源的,可以在这里下载:http://sourceforge.net/projects/deltasql
deltasql在瑞士和印度有效使用,在日本很受欢迎 .
几个月前,我搜索了MySQL模式版本的工具 . 我找到了许多有用的工具,比如Doctrine迁移,RoR迁移,一些用Java和Python编写的工具 .
但他们中没有人满足我的要求 .
我的要求:
没有要求,不包括PHP和MySQL
没有架构配置文件,如Doctrine中的schema.yml
能够从连接读取当前模式并创建新的迁移脚本,而不是在其他应用程序安装中表示相同的模式 .
我开始编写我的迁移工具,今天我有测试版 .
如果您对此主题感兴趣,请尝试一下 . 请寄给我未来的请求和bug报告 .
源代码:bitbucket.org/idler/mmp/src英文概述:bitbucket.org/idler/mmp/wiki/Home俄语概述:antonoff.info/development/mysql-migration-with-php-project
我用http://code.google.com/p/oracle-ddl2svn/
我也对这个话题感兴趣 .
有some discussions on this topic in the Django wiki .
有趣的是,它看起来像CakePHP has schema versioning built-in只使用 cake schema generate 命令 .
cake schema generate
当我登陆新的数据库时:
首先,我检查结构:
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.sqlmysqldump --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.sqldiff FILENAME_1.sql FILENAME_2.sql> DIFF_FILENAME.txtcat DIFF_FILENAME.txt |减感谢stackoverflow用户,我可以编写这个快速脚本来查找结构差异 . src:https://stackoverflow.com/a/8718572/4457531&https://stackoverflow.com/a/26328331/4457531
在第二步中,我使用 mysqldiff 逐表检查数据 . 它有点陈旧但基于 information_schema 数据的php循环确实可以正常工作
mysqldiff
information_schema
对于版本控制,我使用相同的方式,但我格式化SQL更新脚本(升级或回滚)与diff结果,我使用版本号约定(有几个修改版本号看起来像一个IP地址) .
initial version : 1.0.0 ^ ^ ^ | | | structure change: - | | datas added: -------- | datas updated: --------
我正在使用数据库模式的严格版本(在单独的表中跟踪) . 脚本存储在版本控制中,但它们都会在进行任何更改之前验证当前架构版本 .
以下是SQL Server的完整实现(如果需要,可以为MySQL开发相同的解决方案):How to Maintain SQL Server Database Schema Version
经过长时间的调查,我发现有一些第三方工具或Visual Studio项目类型不能满足我,或者只是关于理论的博客但没有实现 . 所以我实现了一个工作系统,使用了将近一年,并在此解释:
http://nalgorithm.com/2015/11/09/database-versioning-part-1/
根据兴趣,意志继续写更多 .
17 回答
如果你还在寻找选择:看看neXtep设计师 . 它是基于版本控制概念的免费GPL数据库开发环境 . 在环境中,您始终使用版本化实体,并且可以专注于数据模型开发 . 发布完成后,插入版本控制系统的SQL生成引擎可以生成两个版本之间所需的任何增量,并在需要时为您提供一些传送机制 .
除此之外,您还可以在开发期间同步和反向同步数据库,创建数据模型图,使用集成的SQL客户端查询数据库等 .
有关更多信息,请查看Wiki:http://www.nextep-softwares.com/wiki
它目前支持Oracle,MySql和PostgreSql,并且在java中,因此该产品可以在windows,linux和mac上运行 .
看到
Is there a version control system for database structure changes?
How do I version my MS SQL database in SVN?
和杰夫的文章
Get Your Database Under Version Control
我感觉到你的痛苦,我希望有更好的答案 . 这可能更接近你想要的 .
Mechanisms for tracking DB schema changes
一般来说,我觉得没有足够的,可接受的解决方案,我在这个领域自己动手 .
你可以看看另一个类似的线程:How do I version my MS SQL database in SVN? .
我确保架构更改始终是附加的 . 所以我不删除列和表,因为这会消除数据并且以后无法回滚 . 这样,可以回滚使用数据库的代码,而不会丢失数据或功能 .
我有一个迁移脚本,其中包含创建表和列的语句(如果它们尚不存在)并用数据填充它们 .
每当 生产环境 代码更新时和新安装后,迁移脚本都会运行 .
当我想删除某些内容时,我会从数据库安装脚本和迁移脚本中删除它们,以便在新安装中逐步淘汰这些过时的架构元素 . 缺点是新安装在安装之前无法降级到旧版本 .
当然,我通过这些脚本执行DDL,而不是直接在数据库上执行以保持同步 .
我没有管理增量 . 我对master数据库进行了更改,并拥有一个基于master数据库创建基于XML的构建脚本的工具 .
当升级现有数据库时,我有一个程序,它使用基于XML的构建脚本来创建新数据库和裸表 . 然后,我使用INSERT INTO x SELECT FROM y从旧数据库复制数据,然后应用所有索引,约束和触发器 .
新表,新列,删除列都会自动处理,并使用一些小技巧来调整复制例程,我可以处理列重命名,列类型更改和其他基本重构 .
我不建议在具有大量数据的数据库上使用此解决方案,但我会定期使用400个表更新超过1GB的数据库 .
你没有使用't mention which RDBMS you',但是如果它在我们创建对象创建脚本之间的增量时是必不可少的 .
我不是一个自己的角,但我开发了一个内部Web应用程序来跟踪数据库模式的更改并创建版本化的更新脚本 .
此工具名为Brazil,现在是MIT许可下的开源 . 巴西是基于rails的ruby / ruby,支持更改部署到任何支持的数据库(MySQL,ODBC,Oracle,Postgres,SQLite) .
计划支持将更新脚本置于版本控制中 .
http://bitbucket.org/idler/mmp - 用于mysql的模式版本控制工具,用PHP编写
我们将数据导出为可移植格式(使用我们的工具链),然后将其导入新架构 . 不需要delta SQL . 强烈推荐 .
我用Firebird数据库用于大多数开发,我使用FlameRobin管理工具 . 它有一个很好的选项来记录所有更改 . 它可以将所有内容记录到一个大文件中,或者每个数据库更改一个文件 . 我使用第二个选项,然后我将每个脚本存储在版本控制软件中 - 之前我使用过Subversion,现在我使用Git .
我假设您可以找到一些具有相同日志记录功能的MySQL工具,如FlameRobin为Firebird所做的那样 .
在其中一个数据库表中,我存储了数据库结构的版本号,因此我可以轻松地升级任何数据库 . 我还写了一个简单的PHP脚本,它在任何目标数据库上逐个执行这些SQL脚本(命令行提供了数据库路径和用户名/密码) .
还可以选择记录所有DML(插入,更新删除)语句,并在修改每个数据库包含的某些“默认”数据时激活它 .
我写了一篇很好的白皮书,详细介绍了我如何做到这一切 . 您可以下载.pdf格式的文件以及来自here的演示PHP脚本 .
我还开发了一组PHP脚本,开发人员可以将他们的deltasql脚本提交到中央存储库 .
在其中一个数据库表(称为TBSYNCHRONIZE)中,我存储了最新执行脚本的版本号,因此我可以使用Web界面或专门为Eclipse开发的客户端轻松升级任何数据库 .
Web界面允许管理多个项目 . 它还支持数据库“分支” .
您可以在http://www.gpu-grid.net/deltasql测试应用程序(如果您使用密码testdbsync以管理员身份登录) . 该应用程序是开源的,可以在这里下载:http://sourceforge.net/projects/deltasql
deltasql在瑞士和印度有效使用,在日本很受欢迎 .
几个月前,我搜索了MySQL模式版本的工具 . 我找到了许多有用的工具,比如Doctrine迁移,RoR迁移,一些用Java和Python编写的工具 .
但他们中没有人满足我的要求 .
我的要求:
没有要求,不包括PHP和MySQL
没有架构配置文件,如Doctrine中的schema.yml
能够从连接读取当前模式并创建新的迁移脚本,而不是在其他应用程序安装中表示相同的模式 .
我开始编写我的迁移工具,今天我有测试版 .
如果您对此主题感兴趣,请尝试一下 . 请寄给我未来的请求和bug报告 .
源代码:bitbucket.org/idler/mmp/src英文概述:bitbucket.org/idler/mmp/wiki/Home俄语概述:antonoff.info/development/mysql-migration-with-php-project
我用http://code.google.com/p/oracle-ddl2svn/
我也对这个话题感兴趣 .
有some discussions on this topic in the Django wiki .
有趣的是,它看起来像CakePHP has schema versioning built-in只使用
cake schema generate
命令 .对于MySQL
当我登陆新的数据库时:
首先,我检查结构:
在第二步中,我使用
mysqldiff
逐表检查数据 . 它有点陈旧但基于information_schema
数据的php循环确实可以正常工作对于版本控制,我使用相同的方式,但我格式化SQL更新脚本(升级或回滚)与diff结果,我使用版本号约定(有几个修改版本号看起来像一个IP地址) .
我正在使用数据库模式的严格版本(在单独的表中跟踪) . 脚本存储在版本控制中,但它们都会在进行任何更改之前验证当前架构版本 .
以下是SQL Server的完整实现(如果需要,可以为MySQL开发相同的解决方案):How to Maintain SQL Server Database Schema Version
经过长时间的调查,我发现有一些第三方工具或Visual Studio项目类型不能满足我,或者只是关于理论的博客但没有实现 . 所以我实现了一个工作系统,使用了将近一年,并在此解释:
http://nalgorithm.com/2015/11/09/database-versioning-part-1/
根据兴趣,意志继续写更多 .