Coin163

首页 > 数据库 - 远程合作开发时如何同步每个人的表结构(Java Spring环境)

数据库 - 远程合作开发时如何同步每个人的表结构(Java Spring环境)

平时公司内开发都是使用同一数据库,现在需要和别人远程合作开发,如何能同步两者开发时表结构的修改?.NET中的EntityFramework和RoR中ActiveRecord提供的脚手架工具都可以自动跟踪历史修改,但是Java中的Hibernate似乎没有对应的功能。

现在能想到的是下面方案
1.用版本管理同步一份SQL文件,然后用diff工具比较再修改表结构。
2.用版本管理工具管理脚本,每一次变更就多一个脚本。这样省掉了比较,然后手写更改代码。但是似乎不容易跟踪从那个文件开始执行。

@greatghoul 提出了可以使用其他成熟的数据库迁移工具来维护数据库,比如单单用Django,来维护数据库迁移。且提供了一可用的迁移工具,参见 Alembic

,

Java 里面似乎没有什么好的 Database Migration 工具。

可以尝试下 Python 的 Alembic 或者 Rails 的 AcitveRecord Migration

单独建个项目,用来维护 Migration 脚本,然后每次有更新就执行将数据库结构同步到最新版就好了。

当然,你也可以搜索下 Java 的 Migration 工具,比如 flywaydb,有兴趣的话,可以来听一听。

如果你在西安,本周六(12月14日)下午1:30,我们GDG-Xian 会在零一广场百怡咖啡中有一个活动,我正好有一个 Alembic Database Migration 的话题,有时间的话,不妨来听一听。

,

我们目前的做法:

  1. 有两个版本 a, b
  2. 部署版本a

    1. 利用hbm2ddl基于a版本生成schema.sql
    2. 执行schema.sql创建database和表等
    3. 使用liquibase执行自定义default.changelog.xml装入初始化数据
  3. 升级版本a至b

    1. 利用hbm2ddl基于b版本生成shcema.sql
    2. 执行b版本的schema.sql创建tmp_database
    3. 使用liquibase的diff,比较database和tmp_database,生成diff.changelog.xml
    4. 移除tmp_database
    5. 使用liquibase的update, 执行自定义的pre-update.chagnelog.xml,解决一些无法自动升级的问题,比如说改变字段名,添加新字段并设置初始值等
    6. 使用liquibase的update,执行diff.changelog.xml完成数据库的升级
    7. 使用liquibase的update, 执行自定义的post-update.changelog.xml, 完成一些其他操作
    8. 完成升级
  • 设置hibernate的hibernate.hbm2ddl.auto为update,这样一些小问题也会fix,可以尝试不设置看会发生什么问题
,

一般是提交SQL文件,同时写一段脚本或代码,在每次服务启动的时候自动更新数据库
对于J2EE来说,Hibernate有专门的同步功能,每次服务启动时,可以按照PO的结构自动刷新数据库结构,无需脚本和SQL文件

平时公司内开发都是使用同一数据库,现在需要和别人远程合作开发,如何能同步两者开发时表结构的修改?.NET中的EntityFramework和RoR中ActiveRecord提供的脚手架工具都可以自动跟踪历史修改,但

------分隔线----------------------------
相关推荐