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

时间:2018-10-13 13:10:34

标签: oracle spring-boot liquibase

我的项目中有一个要求,我想将文件读取到表CLOB数据中。该数据库是oracle 12g。我们正在使用liquibase维护数据。 该项目在springboot中。 Liquibase使用.sql文件来加载更改。

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

关于如何使用“。”的任何指针。或变更集的sql中的“ classpath:”?

我尝试过的尝试之一是通过属性标签以及databaseChangeLog标签在变更集中发送属性。这些属性的值在changeset文件中可用,但它们不解释占位符,例如“ classpath:”。因此,我被困住了。 的 dbms_lob.fileopen 仅接受具有绝对路径的目录对象。不“。”等被理解。的。在文件路径中,从数据库安装根目录开始,这对我没有用。我想要存储所有变更集文件的路径。 如果您以任何方式解决了此问题,请提供帮助。

如果需要,我将发布更多详细信息。 感谢帮助。

3 个答案:

答案 0 :(得分:1)

例如,对我有用的示例:我将此参数放在命令行上作为主变更日志的参考

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

和主文件中

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

changeset中的sql文件将是相同的-它们将相对于.xml进行引用

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

以下是该文档的摘要:

  

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

     
      
  • 作为参数传递给您的Liquibase运行程序(有关如何传递它们的信息,请参阅Ant,command_line等文档)
  •   
  • 作为JVM系统属性   在DatabaseChangeLog文件本身的参数块(标记)中。
  •   

如何使用示例:

<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}而无需从外部设置它的值。