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