我们使用Liquibase来处理我们的DB架构更改。由于我们已经有相当大的一组ChangeLogs分布在多个文件上,以复杂的文件夹结构排列,因此有时需要或希望进行一些重构,这些重构会影响DatabaseChangeLog表中的元信息。
对这种重构有什么建议?我可以使用Liquibase本身来更新DatabaseChangeLog条目吗?还是会遇到缓存问题?
一个简单的例子让我的情况更清楚:
- 我创建了一个新的changeLog文件test/changeLog.xml,默认的logicalFilePath包含一些changeSet
- 随着文件越来越大,我想将其拆分为多个文件,在一些子文件夹中移动它们,并显式地将logicalFilePath属性设置为"myChanges"以对它们进行分组
- 由于这些更改已经运行,我必须更新DATABASECHANGELOG.FILENAME字段,否则Liquibase会认为我引入了新的更改集
- 我需要运行UPDATE DATABASECHANGELOG集FILENAME='myChanges'其中FILENAME='test/changelog.xml'
- 当然,我想以一种自动化的方式来做这件事。最好的方法是什么?我可以使用Liquibase本身吗?或者,在使用新结构运行Liquibase之前,我需要以另一种方式(JDBC或其他方式)更新DATABASECHANGELOG吗
感谢您的反馈!
一些后续行动:
有时候很不幸的是,变更集无法进行调整。考虑以下情况:
- 我们使用VARCHAR2(255字节)创建了一个新表
- 一切都很好,表已经部署并填充了数据
- 我引入了一个嵌入式H2数据库进行测试,它不理解"255字节",但只能理解255。对于原始数据库,将其更改为VARCHAR(255)不会有什么不同,但它会更改变更集的校验和,并导致Liquibase错误
- 删除并重新创建表也不是一个选项,因为表中已经填充了数据
- 使用普通的Liquibase,我最终会得到一个解决方案,比如创建一个新表,移动我的数据,删除旧表并重命名新表
Liquibase不支持重构变更日志文件。它通常希望你在运行后保持原样,以最大限度地减少意外差异。
如果你想四处移动,你列出的步骤就是你需要做的。LogicalFilePath会有所帮助,更新数据库changelog.filename列应该是你所需要做的全部。
在重新组织文件后第一次运行liquibase之前,您需要更新文件名路径,否则它将再次执行changeSets。Liquibase在启动时会立即查看变更日志表和变更日志文件,因此您需要在Liquibase之外更新文件名列。