Mercurial更新之间的数据库同步

时间:2011-04-20 13:41:45

标签: php mysql mercurial sync bitbucket

因此,我有一个开发和生产环境正在访问相同的BitBucket存储库,并且我推送到repo的更改,我使用hg pullhg update来下载生产服务器。 / p>

这使我的PHP代码保持最新状态并正常工作。

但是我可以使用一些建议来保持我的MySQL模式在两个环境之间同步。例如,我经常在开发机器上进行更改,我需要在生产服务器上进行更改。

非常感谢收到关于如何做到这一点的任何建议。

2 个答案:

答案 0 :(得分:3)

简而言之,您要做的是数据库架构的版本,以便在事情发生变化时与代码保持一致。能够做到这一点的关键部分是能够跟踪数据库模式的更改,还能够跟踪数据库模式的当前状态(即它的版本)

跟踪架构更改的一种方法是手动编写对架构的所有更改。这些更改脚本本质上是模式版本之间的“差异”。生成这些更改文件的另一种方法是使用可以在两个数据库之间或数据库和创建脚本之间生成差异的程序。理论上,您应该能够开发一个预提交钩子脚本,该脚本可以从当前数据库为该工作副本和该工作副本的先前数据库生成alter脚本,但这不是一项简单的任务。

一旦您的数据库被版本化,您现在必须解决在Update上应用这些更改的问题。为此,您需要开发一个更新后的钩子,它可以查看数据库(可能在其中的某个Version表中链接到Mercurial变更集ID)并确定需要运行哪些脚本为了使数据库更新。

由于Mercurial允许您更新到以前的版本,您将不得不对数据库进行非重大更改,或者根本不允许(在社会意义上或技术意义上)更新生产工作副本以前的版本。无论您如何处理它,执行实际数据库更新的更新后挂钩脚本可能需要足够聪明才能尝试应用已应用的数据库更改脚本。

显然有许多问题需要解决,还有很多测试可以让这一切都能正常运行,而且它不是一个预先构建的解决方案,但它应该让你顺利通过自动化数据库更新以使其与代码保持一致。祝你好运!

答案 1 :(得分:2)

看一下Rails框架。他们使用数据库迁移来操作(甚至创建)数据库。它集成了测试和跨开发机器(适用于团队)。它是Ruby(很多人认为它比PHP更好)所以除非你切换它,否则它不适合你,但它可能会给你一些关于如何为你的应用程序实现它的想法。

http://guides.rubyonrails.org/migrations.html

  

迁移是一种方便的方式   你改变你的数据库   结构化和有组织的方式您   可以手动编辑SQL的片段   但是你会负责   告诉其他开发人员他们   需要去运行它们。你也是   必须跟踪哪些变化   需要针对生产进行   下次部署时的机器。

     

Active Record会跟踪哪些迁移   已经运行所以你有   要做的是更新您的源并运行   rake db:migrate。积极记录会   确定哪些迁移应该是   跑。它还会更新你的   db / schema.rb文件匹配   数据库的结构。