我们现在正在为这个项目使用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.xmlchangesets-* -files的内容只是changeset 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设置并清空我的数据库?
发布于 2013-09-13 19:40:08
在liquibase上还有一种叫做"logicalFilePath"的东西,它被描述为:
用于在创建变更集的唯一标识符时覆盖文件名和路径。移动或重命名更改日志时需要。
也许这会有帮助。如果我没记错的话,这个选项允许不包括标识符的完整文件路径。
(但这不适用于格式化的sql文件。参见Liquibase Jira中的issue: CORE-915。
发布于 2015-12-23 04:08:58
我喜欢指出上游和用户之间的旧对话:
http://forum.liquibase.org/topic/why-does-the-change-log-contain-the-file-name
我认为上游参数很弱,他们愚蠢地决定在完整文件路径上进行中继。最初的想法是通过CLASSPATH修复文件路径,但您的请求表明这也是错误的。
上游开发者建议直接更新DATABASECHANGELOG.FILENAME列,用全路径修复损坏的条目。
如果您设置了在下次运行LiquiBase时触发散列重新计算的散列DATABASECHANGELOG.MD5SUM或null。您应该这样做,因为哈希算法在计算时使用所有复合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>发布于 2013-09-13 08:38:04
Liquibase有一个"changelogSync“命令,可用于将变更集标记为在数据库中执行。
https://stackoverflow.com/questions/18767815
复制相似问题