#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;
Представления также должны быть запущены после создания функций и таблиц