用于数据库结构的Flyway / Liquibase和用于数据库插入的DBUnit?

我的应用程序有以下场景:

> 1个生产服务器
> 1个测试服务器
> n开发计算机

对于数据库迁移,我们使用Schema和DBUnit的Hibernate Schema Update来填充生产数据(在所有服务器/计算机上).架构更新完成后,我为新架构生成一个新的DTD文件,因此我可以重新导入DBUnit XML.应用程序在启动时使用XML文件更新数据库(仅在开发和测试服务器/计算机上!)

当然,这种方法不是最优和脆弱的.所以我看了Liquibase和Flyway.两者似乎都是很好的工具,但我没有得到的是:我如何迁移数据?在我的例子中,我每周一次转储生产系统的数据并将其作为DBUnit XML文件添加到应用程序源代码控制中,因此所有开发人员都拥有“新鲜”数据,测试服务器也拥有当前生产数据.

我在Liquibase和Flyway看到的问题是,没有解决方法如何从数据库数据中自动执行差异并自动生成迁移更改.

所以我的想法是以下步骤:

>将Hibernate设置为验证而不是更新.
>当需要更改STRUCTURAL数据库时,我将其添加到主要版本的迁移脚本中
>迁移脚本中没有数据库插入.
>根据新的数据库结构为DBunit生成新的DTD
>从生产数据库生成DBUnit XML.

另一个想法是利用flyways JavaMigration并提供基于DBUnit的初始数据库转储.数据库数据的所有其他更改将在迁移脚本中处理.但仍然存在问题:如何从当前迁移脚本状态和生产数据库状态进行差异?

如果有人能提供我如何处理我的场景的提示,那将是很棒的:)

最佳答案 如果你的目标是在DEV和TEST环境中使用PROD数据库的转储,我会:

>配置数据库迁移工具以在应用程序启动时运行(Flyway和Liquibase都通过各自的API支持此功能)
>将所有数据库结构迁移与应用程序一起打包
>从PROD转储数据和结构

这样,当PROD数据库恢复到DEV或TEST时,也会恢复迁移工具的旧元数据表.

当应用程序启动时,迁移工具将发现db结构已过时并将其升级到最新版本.完成.

无需使用DBUnit.

点赞