由于H2版本更新,导致Spring Boot迁移脚本语法问题



我已经将H2数据库的版本(仅用于测试(从1.4.196更新到2.1.210,迁移脚本现在由于语法错误而失败。

迁移脚本有两种类型——项目的前(纯SQL(和后liquibase(基于XML(介绍。

以下是测试yaml配置中定义的内容:

spring:
datasource:
url: jdbc:h2:mem:testdb;Mode=Oracle
platform: h2  // changed to sql.init.platform: h2
jpa:
hibernate:
ddl-auto: validate

我试着添加了spring.datasource.driverClassName=org.h2.Driverspring.jpa.database-platform=org.hibernate.dialect.H2Dialect项目,但没有成功。

我很确定这是由于1.42.1两个版本之间的一些配置差异

评论回复

导致错误的液体酶变更集:

<changeSet id="20191112130000-1" author="zdravko">
<dropColumn tableName="NEWS_CONTENT" columnName="DAY"/>
</changeSet>

错误本身:

Reason: liquibase.exception.DatabaseException: Syntax error in SQL statement "ALTER TABLE PUBLIC.NEWS_CONTENT DROP COLUMN [*]DAY"; expected "identifier"; SQL statement:
ALTER TABLE PUBLIC.NEWS_CONTENT DROP COLUMN DAY [42001-210] [Failed SQL: (42001) ALTER TABLE PUBLIC.NEWS_CONTENT DROP COLUMN DAY]

DAY是H2中的关键字,也是SQL标准中的保留字(即使在完全过时的SQL-92和所有更新版本中(,这意味着它不能用作未引用的标识符。

Liquibase从4.7.0版本开始支持H2 2.x.y及其关键字,如果您使用的是旧版本,则需要升级。如果您使用此版本或更新的版本,则表明出现了问题。

在这种情况下,您可以检查objectQuotingStrategy并使用QUOTE_ALL_OBJECTS:

https://docs.liquibase.com/commands/config-ref/objectquotingstrategy.html

此外,您还可以将;NON_KEYWORDS=DAY添加到H2的JDBC URL中,但如果可以的话,最好避免使用它,因为此设置不太可靠,只有在您不能做任何其他事情时才应该使用。

最新更新