【问题标题】:Spring Boot migration script syntax problems due to H2 version update由于 H2 版本更新导致的 Spring Boot 迁移脚本语法问题
【发布时间】:2022-02-02 09:02:10
【问题描述】:

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

迁移脚本有 2 种类型 - 项目介绍前(纯 SQL)和后 liquibase(基于 XML)。

这是测试yaml config中的挑战:

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 两个版本之间的一些配置差异

评论回复

导致错误的 liquibase 变更集:

<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]

【问题讨论】:

  • H2 2.0 在支持的 SQL 方面发生了重大变化。您遇到了什么失败?是在运行纯 SQL 脚本还是 Liquibase 从 XML 更改日志生成的 SQL 时发生的?
  • @AndyWilkinson 我已经用导致问题的 liquibase 变更集编辑了帖子

标签: java spring-boot testing h2


【解决方案1】:

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

你也可以在H2的JDBC URL中添加;NON_KEYWORDS=DAY,但是如果可以的话最好避免,这个设置不是很可靠,只能在你不能做任何事情的时候使用。

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多