我正在使用Spring 2.6.2并且两者都尝试过:
testImplementation("com.h2database:h2:2.1.214")
和
testImplementation("com.h2database:h2:1.4.200")
我在应用程序启动期间使用JDBC连接到数据库的原始SQL创建数据库模式。
CREATE SCHEMA IF NOT EXISTS "001"
CREATE SCHEMA IF NOT EXISTS "002schema"
CREATE SCHEMA IF NOT EXISTS "3_schema"
然后Liquibase执行数据库迁移。
当针对PostgreSQL运行时,这可以正常工作,并且使用提供的文字字符串创建模式。这些模式中的表也都是小写的,如Liquibase变更日志中指定的那样。
当在单元测试中针对H2运行时,在为002schema
执行数据库迁移时会引发异常。看起来Liquibase期望所有模式都处于大小写状态,从而导致失败。
应用程序启动期间的异常:
Initializing Liquibase for schema 001
Creating database history table with name: "001".DATABASECHANGELOG
Liquibase ran for schema 001
..
Initializing Liquibase for schema 002schema
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibaseMultiTenant' defined in class path resource [com/company/app/data/liquibase/LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.LockException: liquibase.exception.DatabaseException: Schema "002SCHEMA" not found; SQL statement:
CREATE TABLE "002SCHEMA".DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)) [90079-214] [Failed SQL: (90079) CREATE TABLE "002SCHEMA".DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))]
我在H2URL中尝试了以下选项,以防止一切都是大写的,但都不起作用。
有什么想法吗?
spring:
datasource:
platform: h2
url: jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;DATABASE_TO_UPPER=false;
driver-class-name: org.h2.Driver
username: sa
password:
也试过:
spring:
datasource:
platform: h2
url: jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;DATABASE_TO_LOWER=true;CASE_INSENSITIVE_IDENTIFIERS=true;
driver-class-name: org.h2.Driver
username: sa
password:
如果模式的名称是双引号,如“002SCHOMA”或“002schema”,则它区分大小写,否则不区分引号:
PostgreSQL列名是否区分大小写?
也许你可以通过改变这个来解决这个问题:
CREATE SCHEMA IF NOT EXISTS "002schema"
对此:
CREATE SCHEMA IF NOT EXISTS "002SCHEMA"
或者以某种方式使liquibase不在模式名称上使用引号