【问题标题】:Set search_path with H2 and Liquibase使用 H2 和 Liquibase 设置 search_path
【发布时间】:2022-06-22 08:15:22
【问题描述】:

我的项目有问题。

我正在使用 liquibase (v4.8.0) 并在 changelog-master.xml 上包含一个 SQL 文件,其中包含该代码:

CREATE SCHEMA IF NOT EXISTS public;
SET search_path TO public;

当我使用 PostgreSQL 运行我的应用程序时,它可以正常工作,但是当我运行使用 H2 数据库 (h2 v2.1.210) 的测试时,它会因该错误而失败:

引起:org.springframework.beans.factory.BeanCreationException: 在类路径中定义名称为“liquibase”的 bean 创建错误 资源 [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: 调用 init 方法失败;嵌套异常是 liquibase.exception.LiquibaseException: liquibase.exception.MigrationFailedException:迁移失败 变更集 db/schema.sql::raw::includeAll: 语法 SQL 语句“SET [*]search_path TO public;”中的错误;预期的 ”@, 自动提交、排他性、忽略大小写、密码、SALT、模式、数据库、 排序,集群,DATABASE_EVENT_LISTENER,ALLOW_LITERALS, DEFAULT_TABLE_TYPE、SCHEMA、CATALOG、SCHEMA_SEARCH_PATH、 JAVA_OBJECT_SERIALIZER、IGNORE_CATALOGS、会话、事务、时间、 NON_KEYWORDS, DEFAULT_NULL_ORDERING, LOG"; SQL 语句:SET 公开搜索路径; [42001-210] [失败的 SQL:(42001)创建模式 如果不存在,则公开;

我不明白为什么它会失败,而且我也没有在网上找到任何帮助。 提前感谢您的帮助:)

【问题讨论】:

标签: postgresql h2 liquibase


【解决方案1】:

H2 的原生语法是SET SCHEMA_SEARCH_PATH schemaName, …。此语法无条件可用。

当开启PostgreSQL兼容模式时,H2额外提供了SET SEARCH_PATH命令专门实现,它与SET SCHEMA_SEARCH_PATH不同,因为它在没有指定的情况下会先添加pg_catalog,并且支持$user。要启用此兼容模式,您需要将 ;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH 附加到 JDBC 连接 URL。添加;MODE=PostgreSQL 使SET SEARCH_PATH 可用就足够了,但是H2 和PostgreSQL 之间的一些其他偏差需要单独启用,您可能也需要它们。有关模式的详细信息,请参阅兼容模式的文档: https://h2database.com/html/features.html#compatibility

此信息适用于 H2 的新版本。旧的不受支持的版本有不同的选项。

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2018-02-08
    • 1970-01-01
    • 2018-01-16
    • 2018-11-29
    相关资源
    最近更新 更多