使用 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
我在 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