问题描述
我使用了生成命令 - 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 ->> 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:是(自动):原因:liquibase。例外。 DatabaseException:错误:lang() 函数不存在提示:否 函数匹配指定的名称和参数类型。你可能需要 添加显式类型转换。位置:84 [不在 SQL 中:(0) 创建一个 public view.aircraft,如何选择毫升。飞机代码,(毫升。模型 - >
lang()) 作为 ml。航程模型来自aircraft_data ml;]
- 朗
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 堆空间 java.lang.OutOfMemoryError:Java 堆空间 在 java.base/java.lang.StringUTF16.compress(StringUTF16.java:160) 在 java.base/java.lang.String.(String.java:3214) 在 java.base/java.lang.String.(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.run(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$run$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)
然后我删除了 - data 类型。生成的文件没有错误(数据 - 必须删除。由于需要检查大量数据,因此可能会出现错误)。
但我仍然没有在那里看到 - lang() 函数。
据我所知,应该是这样的:create function...
我假设您需要获得专业版许可,因为'创作功能'在专业版中可用。
然后我使用了专业版。
现在我有另一个错误:
rg.springframework.beans.factory.BeanCreationException:创建错误 在类路径资源中定义名为“liquibase”的 bean [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: init 方法调用失败;嵌套异常是 liquibase.exception.UnexpectedLiquibaseException: java.io.IOException: createFunction path=objects/function/lang-bcd8b0c2.sql> - 无法 读取文件
如何配置生成以避免将来出现此类错误,以及如何手动修复?
解决方法
我找到了一种解决方法,但这只是一种解决方法。我只是无法让 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;
视图也必须在创建函数和表后启动