Получение корня проекта в Liquibase sql changeset - PullRequest
0 голосов
/ 13 октября 2018

У меня есть требование в моем проекте, где я хочу читать файлы в данные таблицы CLOB.База данных оракула 12г.Мы используем liquibase для поддержания данных.Проект в Springboot.Liquibase использует файлы .sql для загрузки изменений.

Проблема, с которой я сталкиваюсь, заключается в том, что sql нужен абсолютный путь к файлу, а не путь относительно текущего файла изменений.

Любые указатели относительнокак я могу использовать "."или "classpath:" в sql набора изменений?

Одна из попыток, которые я предпринял, - отправка свойства в наборе изменений через тег свойства с тегом databaseChangeLog.Значения таких свойств доступны в файле набора изменений, но они не интерпретируют заполнители, такие как «classpath:».Следовательно, я застрял.dbms_lob.fileopen принимает только объект каталога с абсолютным путем.Нет "."и т. д. понятно..в пути к файлу начинается с корня установки базы данных, который мне не нужен.Я хотел бы, чтобы путь, где хранятся все файлы изменений.Пожалуйста, помогите Если вы решили эту проблему каким-либо образом ..

Я опубликую более подробную информацию, если потребуется.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Как насчет того, чтобы заранее настроить объект каталога в oracle, а затем использовать символические ссылки на уровне ОС.В зависимости от ваших точных требований вы можете использовать символическое связывание на уровне каталогов или даже напрямую связать файлы с каталогом оракула, чтобы Oracle мог одновременно видеть файлы из разных каталогов в объекте каталога.У них должны быть разные имена файлов.Я не пробовал эту идею, но я думаю, что этот подход - то, что я бы попробовал первымHTH KR

0 голосов
/ 22 октября 2018

Liquibase поддерживает свойства в журналах изменений, которые могут быть установлены различными способами - дополнительная информация: http://www.liquibase.org/documentation/changelog_parameters.html

Вот фрагмент этой документации:

Liquibase позволяет динамически заменятьпараметры в журнале изменений.Заменяемые параметры описываются с использованием синтаксиса $ {}.
Значения параметров ищутся в следующем порядке:

  • Передается в качестве параметра для вашего бегуна Liquibase (см. Ant, command_line и т. Д.).документация о том, как их передавать)
  • Как системное свойство JVM В блоке параметров (Tag) самого файла 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 через свойство while свойствозначение передается с помощью JVM или Build-tools.

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

Однако я думаю, что вы можете использовать ${java.class.path} без установки его значения извне.

0 голосов
/ 16 октября 2018

В качестве примера, что работает для меня: я поставил этот аргумент в командной строке в качестве ссылки на основной журнал изменений

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

и в основном файле

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

Это будет то же самое для файла sql в наборе изменений - на них будут ссылаться относительно .xml

...