Неправильная генерация списка изменений в Liquibase — функция не совпадает… Возможно, вам потребуется добавить явные приведения типов.(liquibase spring.boot)

#spring-boot #liquibase #changelog

#spring-boot #liquibase #Журнал изменений

Вопрос:

Я использовал команду generate the command — changeLogcommand, чтобы загрузить данные и использовать полученный файл в качестве журнала изменений.

 liquibase generateChangeLog
 

Я использую Spring boot 2.4.1

Я использую PostgreSQL 11.x

  • db.changelog-master.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.8.xsd">

    <include file="db/changelog/xml/db/changelog-1.xml"/>

</databaseChangeLog>
 
 
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.1.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
    <changeSet author="IT (generated)" id="1609684188168-1">
        <createTable remarks="Aircrafts (internal data)" tableName="aircrafts_data">
            <column name="aircraft_code" remarks="Aircraft code, IATA" type="CHAR(3)">
                <constraints nullable="false" primaryKey="true" primaryKeyName="aircrafts_pkey"/>
            </column>
            <column name="model" remarks="Aircraft model" type="JSONB">
                <constraints nullable="false"/>
            </column>
            <column name="range" remarks="Maximal flying distance, km" type="INTEGER">
                <constraints nullable="false"/>
            </column>
        </createTable>
    </changeSet>
    <changeSet author="IT (generated)" id="1609684188168-2">

....

    <changeSet author="IT (generated)" id="1609684188168-9">
        <createView fullDefinition="false" remarks="Aircrafts" viewName="aircrafts">SELECT ml.aircraft_code,
            (ml.model -amp;>amp;> lang()) AS model,
            ml.range
            FROM aircrafts_data ml;</createView>
    </changeSet>

...
 
  • pom.xml
  <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
        </dependency>

 

введите описание изображения здесь

Затем я хотел бы применить полученный файл к созданному проекту. Но при запуске появляется ошибка.

Вызвано: liquibase. исключение.Ошибка миграции: ошибка миграции для dB / набора изменений / в формате XML / dB / change-1. Модуль XML:: 1609684188168-9: да (автоматически): Причина: ликвидационная база. исключение. Исключение DatabaseException: ОШИБКА: функция lang () не существует Подсказка: ни одна функция не соответствует указанным именам и типам аргументов. Возможно, вам потребуется добавить явные приведения типов. Позиция: 84 [не в SQL: (0) создание общедоступного view.aircraft, как выбрать ml. aircraft_code, (ml. model — >

lang()) в качестве модели ml. range из aircraft_data ml;]

  • lang
 create function lang() returns text
    stable
    language plpgsql
as
$
BEGIN
  RETURN current_setting('bookings.lang');
EXCEPTION
  WHEN undefined_object THEN
    RETURN NULL;
END;
$;

alter function lang() owner to postgres;
 

Насколько я понимаю, генератор также не смог передать функцию в changelog.xml , а также виды.

Когда я использовал это

  • liquibase.properties
 diffTypes:catalog,tables,functions,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints,data,storedprocedure,triggers,sequences
 

У меня есть ошибки:

[2021-01-03 18:51:02] СЕРЬЕЗНАЯ [liquibase.integration] Непредвиденная ошибка при запуске Liquibase: Java heap space java.lang.Ошибка OutOfMemoryError: пространство кучи Java в java.base / java.lang.StringUTF16.compress(StringUTF16.java:160) в java.base/java.lang .Строка.(String.java:3214) в java.base/java.lang .Строка.(String.java:276) в org.postgresql.core.OptimizedUTF8Encoder.charDecode(OptimizedUTF8Encoder.java:71) в org.postgresql.core.ByteOptimizedUTF8Encoder.decode(ByteOptimizedUTF8Encoder.java:27) в org.postgresql.core.Encoding.decode(Encoding.java:252) в org.postgresql.jdbc.PgResultSet.getString(PgResultSet.java:1910) в org.postgresql.jdbc.PgResultSet.internalGetObject(PgResultSet.java:197) в org.postgresql.jdbc.PgResultSet.GetObject(PgResultSet.java:2577) в liquibase.util.JdbcUtils.getResultSetValue(JdbcUtils.java:80) в liquibase.diff.output.changelog.core .MissingDataChangeGenerator.fixMissing(MissingDataChangeGenerator.java:92) в liquibase.diff.output.changelog .ChangeGeneratorChain.fixMissing(ChangeGeneratorChain.java:48) в liquibase.diff.output.changelog .ChangeGeneratorFactory.fixMissing(ChangeGeneratorFactory.java:95) в liquibase.diff.output.changelog.DiffToChangeLog.generateChangeSets(DiffToChangeLog.java:302) в liquibase.diff.output.changelog .DiffToChangeLog.printNew(DiffToChangeLog.java:226) в liquibase.diff.output.changelog .DiffToChangeLog $1.запустите(DiffToChangeLog.java:133) в liquibase.Scope.lambda $ child $ 0(Scope.java:160) в liquibase.Scope $$ Lambda $ 42 / 0x00000008000ecc40.run (неизвестный источник) в liquibase.Scope.child(Scope.java:169) в liquibase.Scope.child(Scope.java:159) в liquibase.Scope.child(Scope.java:138) в liquibase.diff.output.changelog .DiffToChangeLog.print(DiffToChangeLog.java:127) в liquibase.diff.output.changelog .DiffToChangeLog.print(DiffToChangeLog.java:85) в liquibase.command.core.GenerateChangeLogCommand.run(GenerateChangeLogCommand.java:74) в liquibase.command .AbstractCommand.execute(AbstractCommand.java:19) в liquibase.integration.commandline .CommandLineUtils .doGenerateChangeLog(CommandLineUtils.java:249) в liquibase.integration.commandline.Main.doMigration(Main.java:1519) в liquibase.integration.commandline .Main$1.lambda $выполнить $ 0(Main.java:361) в liquibase.integration.commandline.Main $ 1 $ $ Lambda $ 41 /0x00000008000ec840.run (неизвестный источник) в liquibase.Scope.lambda $ child $ 0(Scope.java:160) в liquibase.Scope $$ Lambda $ 42 / 0x00000008000ecc40.run (неизвестный источник) в liquibase.Scope.child(Scope.java:169)

Затем я удалил — тип данных. Файл был сгенерирован без ошибок (данные — пришлось удалить. Ошибка была возможна из-за того, что необходимо было проверить большое количество данных).

Но я все еще не вижу там функции — lang().

Насколько я понимаю, там должно быть что-то вроде: создать функцию

Я предполагаю, что вам нужно получить лицензию pro, потому что «функция создания» доступна в версии pro.

Затем я использовал версию pro.

Теперь у меня есть другие ошибки:

рг.пружинный каркас.фасоль.фабрика.Исключение BeanCreationException: ошибка при создании компонента с именем ‘liquibase’, определенным в ресурсе пути к классу [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class] : Ошибка вызова метода init; вложенным исключением является liquibase.exception.Непредвиденное исключение liquibaseexception: java.io.IOException: createFunction path=objects/function/lang-bcd8b0c2.sql> -Не удается прочитать файл

Как я могу настроить генерацию, чтобы избежать подобных ошибок в будущем, и как я могу исправить это вручную?

Ответ №1:

Я нашел обходной путь, но это всего лишь обходной путь. Я просто не мог заставить liquibase создать отдельную схему и импортировать все туда.

  • master.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.8.xsd">

    <include file="xml/changelog-2.xml" relativeToChangelogFile="true"/>
    <include file="xml/changelog-3.xml" relativeToChangelogFile="true"/>
    <include file="xml/changelog-4.xml" relativeToChangelogFile="true"/>

</databaseChangeLog>
 
  • changelog-2.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.8.xsd">

    <changeSet author="IT" id="1609692217402-1">
        <sqlFile path="db/changelog/sql/langFunction.sql" splitStatements="false"/>
    </changeSet>


    <changeSet author="IT" id="1609692217402-2">
        <sqlFile path="db/changelog/sql/nowFunction.sql" splitStatements="false"/>
    </changeSet>

</databaseChangeLog>

 
  • langFunction.sql
 create function lang() returns text
    stable
    language plpgsql
as
$
BEGIN
    RETURN current_setting('lang');
EXCEPTION
    WHEN undefined_object THEN
        RETURN NULL;
END;
$;

alter function lang() owner to postgres;
 

Представления также должны быть запущены после создания функций и таблиц