最佳git-mysql版本控制系统



我已经开始与一个由不同项目的人员组成的小型开发团队一起使用git;在我们开始使用Wordpress之前,它一直运行得很好。因为Wordpress在MySQL中存储了很多配置,所以我们决定需要在提交中包含这些配置。

这很好(在预提交时使用msyql转储,在签出后将转储的文件推入mysql),直到两个人对插件进行了修改并提交,然后一切都再次崩溃。

我看过我能找到的每一个解决方案,认为Liquibase是最接近的选择,但对我们来说不起作用。它要求你用XML指定模式,这是不可能的,因为我们使用的插件会自动将数据/表/修改插入数据库
我计划在几天内悬赏,看看是否有人拥有的"金发女郎解决方案"

问题:
有没有一种方法可以在语义上对MySQL数据库进行版本控制(不使用diffs EDIT:这意味着它不只是采用两个版本并对其进行差异化,而是记录按顺序运行的实际查询,以从旧版本到当前版本),而无需开发人员编写的模式文件,也无需使用git进行合并。

我知道我不可能是唯一一个有这样问题的人,但希望有人能解决这个问题?

处理数据库版本控制的正确方法是通过仅添加的版本脚本。由于这种性质,它将一直发生冲突,因为每个分支都将附加到同一个文件。你想要的。它使开发人员意识到彼此的更改如何影响其数据的持久性。重新阅读将确保您只解决一次冲突。(请参阅我关于重新分享的博客文章:http://dymitruk.com/blog/2012/02/05/branch-per-feature/)

保持将每个更改包装在if-then子句中,该子句检查版本号、更改架构或修改查找数据或其他内容,然后递增版本号。你只要每次改变都坚持这样做。

在psuedo代码中,这里有一个示例。

if version table doesn't exist
  create version table with 1 column called "version"
  insert the a row with the value 0 for version
end if
-- now someone adds a feature that adds a members table
if version in version table is 0
  create table members with columns id, userid, passwordhash, salt
    with non-clustered index on the userid and pk on id
  update version to 1
end if
-- now some one adds a customers table
if version in version table is 1
  create table customers with columns id, fullname, address, phone
    with non-clustered index on fullname and phone and pk on id
  update version to 2
end if
-- and so on

这样做的好处是,如果你使用的是静态语言,你可以在测试项目成功构建后自动运行这个脚本——它总是会让你更新到最新版本。如果您刚刚更新到最新版本,那么所有的验收测试都应该通过。

问题是,你如何同时处理两个不同的分支?我过去所做的只是创建一个新实例,该实例在数据库名称中由分支名称分隔。您的配置文件将被清理(请参阅git smud/clean),以将连接字符串设置为指向该分支的新实例或现有实例。

如果您使用ORM,您可以自动生成此脚本,例如,nhibernate将允许您将尚未反映在数据库模式中的图形更改导出为sql脚本。因此,如果您为customer类添加了映射,NHibernate将允许您生成表创建脚本。您只需编写if-then包装器的添加脚本,就可以在功能分支上实现自动化。

集成分支和发布候选分支有一些特殊要求,如果要重置这些分支,则需要擦除和重新创建数据库。通过确保新修订git branch --contains是旧修订,这很容易在挂钩中完成。如果没有,请擦拭并重新生成。

我希望这是清楚的。这在过去运行得很好,需要每个开发人员都能够在自己的机器上创建和销毁自己的dbs实例,尽管可以在具有额外实例命名约定的中心实例上运行。

最新更新