我正在使用Spring,JPA / Hibernate和MS SQL Server / PostgreSQL开发Java Web应用程序。为了使已安装系统的数据库迁移更容易,我希望在应用程序启动时集成Liquibase以自动执行更新。目前我总是创建更新脚本,我必须以正确的顺序手动执行。
我测试了与Spring的集成,我很快就完成了它。 Liquibase的元表正在使用第一个变更集创建,并执行更改。问题是已经存在一些已安装的系统,但未来可能会有其他安装。
是否可以使用Liquibase检测数据库是否为空并在新安装的系统中自动执行DDL?否则我将不得不手动执行DDL而不是启动应用程序。
我想要的是数据库在空时自动初始化,如果已经存在则会更新。有可能用Liquibase做到这一点,还是有任何技巧可以使这个工作?
答案 0 :(得分:3)
当您开始在具有现有架构的现有系统上使用liquibase时,基本上有两个选项:
假设所有数据库都将从已知的起始点开始。在liquibase之外做任何你需要的东西来实现它们(从快照恢复,手动构建等)
使用liquibase generateChangeLog命令为现有数据库创建changeSet。您只想在新数据库上运行它,因此您可以使用自定义liquibase spring集合调用来控制它,或者将生成的changeLog向下折叠到一个带有<preConditions onFail="MARK_RAN"><not><tableExists tableName="table name here"/></not></preConditions>
块的changeSet。
答案 1 :(得分:0)
Liquibase是否可以检测数据库是否为空并在新安装的系统中自动执行DDL?
好吧,如你所说,
利用第一个变更集创建Liquibase的元表,并执行更改。
所以如果您的DDL语句属于变更集(可能是第一个变更集),那么一切都应该没问题。
使用Liquibase是否有可能做到这一点,还是有任何技巧可以让它发挥作用?
是的,应该没有任何技巧。