在 H2 内存数据库的 liquibase 迁移中找不到列

Column not found at liquibase migration for H2 in-memory database

我不得不用 H2 内存数据库替换我的 PostgreSQL 数据库,我的迁移开始失败。创建 table 脚本运行但插入失败。

ChangeSet classpath:database/changelog/create-default-user.xml::createUserTable::ethero ran successfully in 7ms
Change Set classpath:database/changelog/create-default-user.xml::insertDefaultUser::ethero failed.  Error: Column "username" not found; SQL statement:

错误堆栈跟踪

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set classpath:database/changelog/create-default-user.xml::insertDefaultUser::ethero:
     Reason: liquibase.exception.DatabaseException: Column "username" not found; SQL statement:
INSERT INTO usr ("username", "password") VALUES ('admin', 'password') [42122-200] [Failed SQL: (42122) INSERT INTO usr ("username", "password") VALUES ('admin', 'password')]

创建table脚本

create table user_authorities (username varchar(255) not null , authorities varchar(255));
create table usr (username varchar(255) not null , password varchar(255), image_url varchar(255))

插入用户脚本

INSERT INTO usr ("username", "password") VALUES ('admin', 'password');
INSERT INTO user_authorities ("username", "authorities") VALUES ('admin', 'ADMIN');
INSERT INTO user_authorities ("username", "authorities") VALUES ('admin', 'USER');

Spring 启动配置

spring:
  profiles:
    active: dev
  datasource:
    url: jdbc:h2:mem:pc;DB_CLOSE_DELAY=-1;
    username: sa
    password: sa
    driver-class-name: org.h2.Driver
  jpa:
    generate-ddl: true
    hibernate:
      ddl-auto: update
    show-sql: true

  liquibase:
    change-log: classpath:database/changelog-master.xml
    url: jdbc:h2:mem:pc;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

Spring开机版本:2.4.3

PostgreSQL 和其他一些 DBMS 的不同之处在于:它们将未加引号的标识符转换为小写。 H2 和许多其他人将未加引号的标识符转换为大写,这种行为实际上是一种标准行为。

如果你出于某种原因想同时使用这两个DBMS,你可以将;DATABASE_TO_LOWER=TRUE添加到H2的JDBC url,使用这个参数H2将处理标识符中的大小写与 PostgreSQL 一样。

但如果您只想使用 H2,最好不要使用此类设置并调整您的 SQL 以在引用的标识符中使用大写字母。

无论如何,混用带引号和不带引号的标识符是一种不好的做法。通常最好总是引用或从不引用它们。请注意,有各种保留字,这些字不能用作不带引号的标识符。