使用H2和Liquibase设置search_path



我的项目有问题。

我使用的是likibase(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:创建在类路径中定义了名称为"likibase"的bean时出错资源[org/springframework/boot/autoconfig/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]:init方法调用失败;嵌套异常为liquibase.exception.LiqibaseException:liquibase.exception.MigrationFailedException:的迁移失败变更集db/schema.sql::raw::includeAll:语法SQL语句中的错误";将[*]search_path设置为public";预期的"@",自动提交,独占,忽略,密码,SALT,模式,数据库,排序规则,集群,DATABASE_EVENT_LISTENER,ALLOW_LITERALS,DEFAULT_TABLE_TYPE,架构,目录,SCHEMA_sasearch_PATH,JAVA_OBJECT_SERIALIZER,IGNORE_CATALOGS,会话,事务,时间,NON_KEYWORDS,DEFAULT_NULL_ORDERING,LOG";;SQL语句:SETsearch_path TO public;[44201-210][失败的SQL:(42001)CREATE SCHEMA如果不存在,则公开;

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

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的新版本是实际的。不支持的旧版本有不同的选项。

最新更新