我正在使用Liquibase来处理我正在进行的这个项目,并且所有的更改日志都在一个大的XML文件中。不幸的是,这个文件太大了 - 我们想要引入一个“主”文件,包括原始文件和任何新文件。
旧结构:
/db/changesets-from-beginning-of-time.xml
新结构:
/db/changesets/changesets-from-beginning-of-time.xml
/db/changesets/changesets-v.1.2.3.xml
/db/changesets/changeset-master.xml
changesets-*
文件的内容只是变更集xml,而changeset-master.xml
文件看起来像这样:
<databaseChangeLog xmlns="...skipped...">
<include file="changesets-from-beginning-of-time.xml"
relativeToChangelogFile="true"/>
<include file="changesets-v1.2.3.xml"
relativeToChangelogFile="true"/>
</databaseChangeLog>
现在,我数据库中的DATABASECHANGELOG
表引用了旧文件,因此旧的更改集再次运行。
根据Liquibase documentation,每个变更集都由[filepath/-name]:::[id]:::[author]
组合唯一标识 - 这对我来说不是最佳。
所以我的问题是 - 如何在不破坏liquibase设置和清空数据库的情况下重构文件结构?
答案 0 :(得分:10)
liquibase上还有一个名为"logicalFilePath"的东西,描述如下:
用于在创建更改集的唯一标识符时覆盖文件名和路径。移动或重命名更改日志时需要。
也许这有帮助。 如果我没记错,这个选项允许不包含标识符的完整文件路径。
(但这对格式化的sql文件不起作用。请参阅Liquibase Jira中的issue: CORE-915。
答案 1 :(得分:6)
我想指出上游与用户之间的旧对话:
http://forum.liquibase.org/topic/why-does-the-change-log-contain-the-file-name
我认为上游论据很弱,他们会在完整文件路径上做出愚蠢的决定。最初的想法是通过CLASSPATH
修复文件路径,但您的请求显示这也是错误的。
上游开发人员建议在DATABASECHANGELOG.FILENAME
列上执行直接更新,以使用完整路径修复损坏的条目。
如果您设置哈希值DATABASECHANGELOG.MD5SUM
ot null
,则会在下一次LiquiBase运行时触发哈希重新计算。您应该这样做,因为哈希算法在计算时使用所有复合ID部分。
logicalFilePath
可以应用于顶级XML标记:
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd"
logicalFilePath="legacy.xml">
...
</databaseChangeLog>
或者可能被每个变更集覆盖:
<changeSet author="admin" id="fix-25" logicalFilePath="fix.xml">
...
</changeSet>
SQL语法也具有顶级文件标记的logicalFilePath
属性(在v3.3中实现):
--liquibase formatted sql logicalFilePath:legacy.sql
并且可以在每个变更集标记中重写::
--changeset db-maint:tune-indexed logicalFilePath:other.sql
要验证设置是否有效,请使用:
mvn liquibase:changelogSyncSQL
并审核migration.sql
。相应的pom.xml
部分:
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase.version}</version>
<configuration>
<changeLogFile>${basedir}/src/main/resources/sql/master.xml</changeLogFile>
<propertyFile>${liquibase.profile}</propertyFile>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<migrationSqlOutputFile>migration.sql</migrationSqlOutputFile>
</configuration>
</plugin>
答案 2 :(得分:4)
Liquibase有一个“changelogSync”命令,可用于将变更集标记为在数据库中执行。