Liquibase 中更改日志的生成不正确 - 没有函数匹配...您可能需要添加显式类型转换(liquibase + spring.boot)

问题描述

我使用了生成命令 - 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 -&gt;&gt; lang()) AS model,ml.range
            FROM aircrafts_data ml;</createView>
    </changeSet>

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

enter image description here

然后我想将生成的文件应用到创建的项目中。但是启动时出现错误。

原因: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;

视图也必须在创建函数和表后启动

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...