在 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 以在引用的标识符中使用大写字母。
无论如何,混用带引号和不带引号的标识符是一种不好的做法。通常最好总是引用或从不引用它们。请注意,有各种保留字,这些字不能用作不带引号的标识符。
我不得不用 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 以在引用的标识符中使用大写字母。
无论如何,混用带引号和不带引号的标识符是一种不好的做法。通常最好总是引用或从不引用它们。请注意,有各种保留字,这些字不能用作不带引号的标识符。