在 Liquibase sql 变更集中获取项目根目录



我的项目中有一个要求,我想将文件读入表 CLOB 数据。数据库是oracle 12g。我们正在使用liquibase来维护数据。 该项目处于春季启动状态。Liquibase 使用.sql文件来加载更改。

我面临的障碍是 sql 需要文件的绝对路径,而不是相对于当前变更集文件的路径。

关于如何在变更集的 sql 中使用"."或"类路径:"的任何指示?

我所做的尝试之一是通过属性标记和数据库更改日志标记发送变更集中的属性。此类属性的值在变更集文件中可用,但它们不会像"classpath:"那样解释占位符。因此,我被困住了。 这dbms_lob.fileopen仅接受具有绝对路径的目录对象。不理解"."等。这。在文件路径中从数据库安装根目录开始,这对我来说毫无用处。我想要存储所有变更集文件的路径。 如果您以任何方式解决了这个问题,请帮助。

如果需要,我会发布更多详细信息。 感谢您的帮助..

例如对我有用: 我把这个参数放在命令行上作为主更新日志的参考

--changeLogFile=src/main/resources/changelog/db.changelog-master.xml

并在主文件中

<include file="./changes/db.changelog-ddl-.....xml" relativeToChangelogFile="true"/>

对于变更集中的 sql 文件也是如此 - 它们将相对于.xml引用

提前在oracle 中设置目录对象,然后在操作系统级别使用符号链接怎么样?根据您的确切要求,您可以在目录级别使用符号链接,甚至可以直接将文件链接到 oracle 目录,以便 Oracle 可以在目录对象中一次查看来自许多不同目录的文件。然后它们需要有不同的文件名。我没有尝试过这个想法,但我想这种方法是我首先要尝试的。赫赫·

Liquibase 支持更改日志中的属性,这些属性可以通过各种方式进行设置 - 更多信息: http://www.liquibase.org/documentation/changelog_parameters.html

以下是该文档的片段:

Liquibase 允许动态替换更改日志中的参数。 要替换的参数使用 ${} 语法进行描述。
参数值按以下顺序查找:

  • 作为参数传递给您的 Liquibase 运行器(有关如何传递它们,请参阅 Ant、command_line 等文档(
  • 作为 JVM 系统属性 在数据库更改日志文件本身的参数块 ( 标记( 中。

如何使用的示例:

<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<property name="clob.type" value="clob" dbms="oracle"/>
<property name="clob.type" value="longtext" dbms="mysql"/>
<changeSet id="1" author="joe">
<createTable tableName="table1">
<column name="id" type="int"/>
<column name="${columnname}" type="varchar(20)"/>
</createTable>
</changeSet>

您可以轻松地通过属性在SQL更改集中设置文件路径,而属性值则通过JVM或构建工具传递。

@echo off
call Liquibase --changeLogFile=myChangeLogFile.xml update -Dcolumnname=myclm

但是我认为您可以使用${java.class.path}而无需从外部设置其值。

最新更新