从版本化mysql schemata开始,没有过度杀伤力.好的解决方案

mar*_*kus 7 php mysql svn version-control database-versioning

我已经到了这一点,我意识到我必须开始对数据库模式进行版本控制并进行更改.因此,我阅读了有关该主题的现有帖子,但我不知道如何继续.

我基本上是一个单人公司,不久前我甚至没有为我的代码使用版本控制.我在Windows环境中使用Aptana(IDE)和SVN(使用Tortoise).我从事PHP/mysql项目.

版本化我的数据库模式的有效且充足(没有过度杀伤)的方法是什么?

我在一些项目中确实有一两个自由职业者,但我不希望进行大量的分支和合并.所以基本上我想跟踪我的代码修订的并发模式.

[编辑] 瞬间解决方案:目前我决定只要我提交一个标签(稳定版本),我将只生成一个模式转储加上一个必要的初始数据.在目前阶段,这对我来说似乎已经足够了.[/ edit]

[edit2]此外我现在还使用了名为incrementments.sql的第三个文件,其中我将所有更改与日期等相关联,以便在一个文件中轻松跟踪更改历史记录.我不时将更改集成到另外两个文件中并清空increments.ql [/ edit]

Man*_*kis 7

小公司的简单方法:将数据库转储到SQL并将其添加到存储库.然后每次更改内容时,在转储文件中添加更改.

然后,您可以使用diff查看版本之间的更改,更不用说有解释您的更改的注释.这也将使您几乎免受MySQL升级的影响.

我看到的一个缺点是你必须记住手动将SQL添加到转储文件中.你可以训练自己永远记住,但如果你和别人一起工作要小心.错过更新可能会在以后痛苦.

这可以通过在提交subversion时为你创建一些精心设计的脚本来缓解,但这对于一个人的节目来说有点多了.

编辑:在这个答案之后的那一年,我不得不为一个小团队实现MySQL的版本控制方案.手动添加每个更改被视为一个麻烦的解决方案,就像在评论中提到的那样,所以我们继续转储数据库并将该文件添加到版本控制中.

我们发现测试数据最终在转储中,并且很难弄清楚改变了什么.这可以通过仅转储模式来解决,但这对我们的项目来说是不可能的,因为我们的应用程序依赖于数据库中的某些数据来运行.最终我们返回手动添加对数据库转储的更改.

这不仅是最简单的解决方案,而且还解决了MySQL的某些版本在导出/导入时遇到的某些问题.通常我们必须转储开发数据库,​​删除任何测试数据,日志条目等,删除/更改适用的某些名称,然后才能创建生产数据库.通过手动添加更改,我们可以准确地控制最终生产的内容,一次一点,这样最终一切准备就绪,并且尽可能轻松地转移到生产环境.


mar*_*kus 1

我认为这个问题值得一个现代的答案,所以我自己来回答。当我在 2009 年写这个问题时,我认为Phinx还不存在,而且 Laravel 肯定也不存在。

今天,这个问题的答案非常明确:编写增量数据库迁移脚本,每个脚本都有一个up方法down,并在安装或更新应用程序时运行所有这些脚本或其中的增量脚本。显然,将迁移脚本添加到您的 VCS 中。

正如一开始提到的,当今 PHP 世界中有一些优秀的工具可以帮助您轻松管理迁移。Laravel 内置了数据库迁移,包括相应的 shell 命令。其他人都有同样强大的与框架无关的 Phinx 解决方案。

Artisan 迁移 (Laravel) 和 Phinx 的工作方式相同。对于数据库中的每个更改,创建一个新的迁移,使用纯 SQL 或内置查询生成器编写 up 和 down 方法并分别运行artisan migratephinx migrate在控制台中。