使用 Liquibase 的 JOOQ 代码生成,保留关键字? (错误 "value" 列名)

JOOQ code generation with Liquibase, reserved keyword? (error with "value" column name)

我在 liquibase 脚本中定义了一个 table,其中有一列名为“value”:

- column:
    name: value
    type: VARCHAR
    constraints:
      - nullable: false

dbms 是 postgresql

当 运行 使用 maven 插件的 JOOQ codegen 时,它运行 liquibase 脚本并且出现以下错误:

Syntax error in SQL statement "CREATE TABLE PUBLIC.TABLE_NAME (ID BIGINT AUTO_INCREMENT NOT NULL, ... , VALUE[*] VARCHAR NOT NULL)"; expected "identifier";

如果我将列名从“值”更改为其他任何名称,它就会起作用。使用 JOOQ 到 3.15 版,它可以工作。

关于如何处理这个问题的任何线索?我宁愿不更改名称,我有多个 table,其中有一列名为“值”,因此这是一个相当大的重构,而且命名明智,我觉得它是最适合它所代表的名称。

解决方案

这已经在较新版本的 liquibase 中修复,因此您可以在 jOOQ codegen 中手动指定要使用的 LB 版本:

<plugin>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen-maven</artifactId>
        <version>${jooq.version}</version>
        <dependencies>
          <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>${liquibase.version}</version>
          </dependency>
        ...
</plugin>

为什么会这样

LiquibaseDatabase in jOOQ 3.16's code generation configuration works by simulating your migration against an in-memory H2 database,从 H2 2.0 开始不兼容地声明了 VALUE 关键字,如果不加引号就不能再用作标识符。

Liquibase 中的解决方法

因此,您的解决方法可能是引用所有对象(或保留字,如果 Liquibase 与 H2 的最新更改保持同步): https://docs.liquibase.com/parameters/object-quoting-strategy.html

例如

databaseChangeLog:
    -  object-quoting-strategy: QUOTE_ALL_OBJECTS

但是,这意味着您应确保在 Liquibase 配置中仅使用小写标识符,以免在 PostgreSQL 数据库中意外创建区分大小写的标识符

正在升级 Liquibase

我无法使用最新版本的 Liquibase 重现此内容。看来他们已经解决了这个问题,现在可以正确支持 H2 2.x

jOOQ 的未来修复

jOOQ 应该在 jOOQ 方面解决这个问题。最终,H2 将从等式中移除(至少可以选择不使用它),jOOQ 将直接解释 Liquibase 生成的 DDL 以生成您的代码。相关的功能请求是: https://github.com/jOOQ/jOOQ/issues/7034