2

我正在使用 Spring、JPA/Hibernate 和 MS SQL Server/PostgreSQL 开发 Java Web 应用程序。为了使已安装系统的数据库迁移更容易,我想集成 Liquibase 以在应用程序启动时自动进行更新。目前我一直在创建更新脚本,我必须以正确的顺序手动执行。

我测试了与 Spring 的集成,我很快就让它工作了。Liquibase 的元表使用第一个变更集创建并执行更改。问题是已经存在一些已安装的系统,但将来可能会有其他安装。

Liquibase 是否可以检测数据库是否为空并在新安装的系统中自动执行 DDL?否则我将不得不手动执行 DDL,然后启动应用程序。

我想要的是数据库在它为空时自动初始化,或者如果它已经存在则更新。有没有可能用 Liquibase 做到这一点,或者有什么技巧可以让它发挥作用?

4

2 回答 2

3

当您开始在具有现有架构的现有系统上使用 liquibase 时,基本上有两种选择:

  1. 假设所有数据库都将从一个已知的起点开始。在 liquibase 之外做任何你需要的事情来让它们达到这一点(从快照恢复、手动构建等)

  2. 使用 liquibase generateChangeLog 命令为现有数据库创建变更集。您只想在新数据库上运行它,因此您可以使用自定义 liquibase spring 集成调用来控制它,或者将生成的 changeLog 折叠到一个 changeSet 并<preConditions onFail="MARK_RAN"><not><tableExists tableName="table name here"/></not></preConditions>在开始时使用一个块。

于 2012-03-09T21:09:16.727 回答
0

Liquibase 是否可以检测数据库是否为空并在新安装的系统中自动执行 DDL?

嗯,正如你提到的,

Liquibase 的元表使用第一个变更集创建并执行更改。

因此,如果您的 DDL 语句在变更集中(可能是第一个变更集),那么一切都应该没问题。

有没有可能用 Liquibase 做到这一点,或者有什么技巧可以让它发挥作用?

是的,没有任何技巧应该是可能的。

于 2012-03-07T13:21:51.810 回答