Ben*_*Ben 15 mysql database git version-control merge
我已经开始使用git和一个小型开发团队来进行不同的项目; 它工作得很好,直到我们开始使用Wordpress.因为Wordpress在MySQL中存储了很多配置,所以我们决定在提交中包含它.
这很好用(在预提交时使用msyql dump,并在post-checkout上将转储的文件推送到mysql),直到两个人对插件进行修改并提交,然后一切都再次破坏.
我看过我能找到的每一个解决方案,并认为Liquibase是最接近的选择,但对我们不起作用.它要求您在XML中指定模式,这实际上是不可能的,因为我们使用的插件会自动将数据/表/修改插入到数据库中.
我计划在几天内给它一个赏金,看看是否有人有以下的"金发女郎解决方案":
问题:
是否有一种方法可以在语义上对MySQL数据库进行版本控制(不使用diffs EDIT:意味着它不仅仅采用两个版本并对其进行区分,而是记录按顺序运行的实际查询以从旧版本获取在没有开发人员编写的模式文件的要求的情况下,可以使用git进行合并.
我知道我不可能是唯一一个有这样问题的人,但希望有人有解决方案吗?
处理数据库版本控制的正确方法是通过仅附加的版本脚本。由于这种性质,它总是会发生冲突,因为每个分支都会附加到同一个文件。你想要那个。它使开发人员意识到彼此的更改如何影响其数据的持久性。Rerere 将确保您只解决一次冲突。(请参阅我的博客文章,涉及 rerere 共享:http://dymitruk.com/blog/2012/02/05/branch-per-feature/)
继续将每个更改包含在 if then 子句中,该子句检查版本号、更改架构或修改查找数据或其他内容,然后递增版本号。您只需为每次更改继续执行此操作即可。
在伪代码中,这是一个示例。
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
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,如果您使用静态语言,您可以在成功构建测试项目后自动运行此脚本 - 它总是会将您滚动到最新版本。如果您刚刚更新到最新版本,所有验收测试都应该通过。
问题是,如何同时在两个不同的分支上工作?我过去所做的只是启动一个新实例,该实例在数据库名称中由分支名称分隔。您的配置文件已清理(请参阅 git smudge/clean)以将连接字符串设置为指向该分支的新实例或现有实例。
如果您使用 ORM,则可以自动生成此脚本,例如,nhibernate 将允许您将尚未反映在数据库模式中的图形更改导出为 SQL 脚本。因此,如果您添加了客户类的映射,NHibernate 将允许您生成表创建脚本。您只需编写添加 if-then 包装器的脚本,然后就可以在功能分支上实现自动化。
集成分支和发布候选分支有一些特殊要求,如果您要重置这些分支,则需要擦除并重新创建数据库。通过确保新版本是旧版本,可以很容易地在钩子中做到这一点git branch --contains
。如果没有,请擦拭并再生。
我希望这是清楚的。这在过去很有效,并且要求每个开发人员都能够在自己的机器上创建和销毁自己的数据库实例,尽管可以在具有附加实例命名约定的中央实例上工作。