将 spring-boot-starter-parent 从 2.1.1 升级到 2.3.3 后 SQL 语句中的语法错误
Syntax error in SQL statement after upgrading spring-boot-starter-parent from 2.1.1 to 2.3.3
为了测试和调整 Spring Boot 的一些内部结构,我有一个示例 Spring Boot 项目,我经常故意破坏它,并从其内部结构中学习新的东西。
现在,我有一个 Spring 启动项目,带有 pom,例如:
<?xml version='1.0' encoding='UTF-8'?>
<project xmlns='http://maven.apache.org/POM/4.0.0'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.springboot</groupId>
<artifactId>spring-boot-application</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
和Flyway的迁移,有:
CREATE TABLE PERSON(
PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
PERSON_NAME VARCHAR(20) NOT NULL,
PERSON_SURNAME VARCHAR(20) NOT NULL,
PERSON_AGE BIGINT,
);
工作正常,直到 spring-boot-starter-parent
版本为 2.1.1。
我现在决定升级一些依赖项,看看会如何以及什么会破坏(因为在使用 Spring 基础设施时经常发生)。因此,将 spring-boot-starter-parent
版本升级到 2.3.3 后,上面的 SQL 脚本开始抛出:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException:
Migration V1__initial_schema.sql failed
---------------------------------------
SQL State : 42001
Error Code : 42001
Message : Syntax error in SQL statement "CREATE TABLE PERSON(
PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
PERSON_NAME VARCHAR(20) NOT NULL,
PERSON_SURNAME VARCHAR(20) NOT NULL,
PERSON_AGE BIGINT,
)[*]"; expected "identifier"; SQL statement:
CREATE TABLE PERSON(
PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
PERSON_NAME VARCHAR(20) NOT NULL,
PERSON_SURNAME VARCHAR(20) NOT NULL,
PERSON_AGE BIGINT,
) [42001-200]
坦率地说,尽管异常看起来很清楚,但与此同时,它没有清楚地说明确切的问题是什么,[=42]有点棘手=]猜猜相同的语法如何在稍旧的版本上工作。
我猜测并删除了最后一个逗号(在最后一个 PERSON_AGE BIGINT
列的定义之后),它又开始工作了。
我很想了解幕后真正导致此异常的原因。在升级 spring-boot-starter-parent
时,我真的看不到项目中有任何传递依赖项发生变化,这归咎于任何特定的库或 .jar
.. 然而,某些东西 必须是 导致此异常,我想了解 - 是什么。
我已经测试了两种语法(带和不带最后的逗号“,”)并且都工作得很好,作为一个独立的 SQL 查询,在 SQL shell 中;但是,它在上述情况下不起作用。
有人能对此有更多的说明吗?
感谢。
H2 dropped support for trailing commas in 1.4.200. Spring Boot upgraded to H2 1.4.200 在 2.1.10 和 2.2.1 中,在撰写本文时,它已成为所有 Spring 引导版本中 H2 的默认版本。当您升级到 Spring Boot 2.3.3 时,您也会升级到 H2 1.4.200,因此不再支持迁移中的尾随逗号。
如果您对这些版本的来源感到好奇,它们是通过 spring-boot-starter-parent
继承的,它使用 spring-boot-dependencies
作为其父级。 spring-boot-dependencies
包含众多 Spring 项目和第三方依赖项(包括 H2)的依赖项管理。任何给定版本的 Spring Boot 的默认版本都包含在参考文档中:
为了测试和调整 Spring Boot 的一些内部结构,我有一个示例 Spring Boot 项目,我经常故意破坏它,并从其内部结构中学习新的东西。
现在,我有一个 Spring 启动项目,带有 pom,例如:
<?xml version='1.0' encoding='UTF-8'?>
<project xmlns='http://maven.apache.org/POM/4.0.0'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.springboot</groupId>
<artifactId>spring-boot-application</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
和Flyway的迁移,有:
CREATE TABLE PERSON(
PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
PERSON_NAME VARCHAR(20) NOT NULL,
PERSON_SURNAME VARCHAR(20) NOT NULL,
PERSON_AGE BIGINT,
);
工作正常,直到 spring-boot-starter-parent
版本为 2.1.1。
我现在决定升级一些依赖项,看看会如何以及什么会破坏(因为在使用 Spring 基础设施时经常发生)。因此,将 spring-boot-starter-parent
版本升级到 2.3.3 后,上面的 SQL 脚本开始抛出:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException:
Migration V1__initial_schema.sql failed
---------------------------------------
SQL State : 42001
Error Code : 42001
Message : Syntax error in SQL statement "CREATE TABLE PERSON(
PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
PERSON_NAME VARCHAR(20) NOT NULL,
PERSON_SURNAME VARCHAR(20) NOT NULL,
PERSON_AGE BIGINT,
)[*]"; expected "identifier"; SQL statement:
CREATE TABLE PERSON(
PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
PERSON_NAME VARCHAR(20) NOT NULL,
PERSON_SURNAME VARCHAR(20) NOT NULL,
PERSON_AGE BIGINT,
) [42001-200]
坦率地说,尽管异常看起来很清楚,但与此同时,它没有清楚地说明确切的问题是什么,[=42]有点棘手=]猜猜相同的语法如何在稍旧的版本上工作。
我猜测并删除了最后一个逗号(在最后一个 PERSON_AGE BIGINT
列的定义之后),它又开始工作了。
我很想了解幕后真正导致此异常的原因。在升级 spring-boot-starter-parent
时,我真的看不到项目中有任何传递依赖项发生变化,这归咎于任何特定的库或 .jar
.. 然而,某些东西 必须是 导致此异常,我想了解 - 是什么。
我已经测试了两种语法(带和不带最后的逗号“,”)并且都工作得很好,作为一个独立的 SQL 查询,在 SQL shell 中;但是,它在上述情况下不起作用。
有人能对此有更多的说明吗?
感谢。
H2 dropped support for trailing commas in 1.4.200. Spring Boot upgraded to H2 1.4.200 在 2.1.10 和 2.2.1 中,在撰写本文时,它已成为所有 Spring 引导版本中 H2 的默认版本。当您升级到 Spring Boot 2.3.3 时,您也会升级到 H2 1.4.200,因此不再支持迁移中的尾随逗号。
如果您对这些版本的来源感到好奇,它们是通过 spring-boot-starter-parent
继承的,它使用 spring-boot-dependencies
作为其父级。 spring-boot-dependencies
包含众多 Spring 项目和第三方依赖项(包括 H2)的依赖项管理。任何给定版本的 Spring Boot 的默认版本都包含在参考文档中: