jooq - 尽管配置,JOOQ 不会忽略未知功能
问题描述
由于框架未知的功能,我的 jOOQ 代码生成配置失败。配置使用org.jooq.meta.extensions.ddl.DDLDatabase
,旨在从 Flyway 迁移脚本生成代码。错误如下:
Error running jOOQ code generation tool: Error while exporting schema: SQL [create table CUSTOMER (ID uuid not null default UUID_GENERATE_V4(), NAME varchar(255) not null, primary key (ID))]; Function "UUID_GENERATE_V4" not found;
通过检查文档,我看到有一个parseUnknownFunctions
解析器属性,据我所知,当设置为IGNORE
. 这似乎没有任何效果。
我也知道有一种解决方法可以让 jOOQ 通过添加注释来忽略 SQL 文件的某些部分。在我的情况下这是不可能的,因为我不是 SQL 文件的所有者。
我还有其他选择吗?
以下是导致错误的脚本和 pom.xml 中的 jOOQ 配置:
create table customer (
id uuid not null default uuid_generate_v4(),
name varchar(255) not null,
primary key (id)
);
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
<execution>
<id>generate-jooq-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generator>
<database>
<name>org.jooq.meta.extensions.ddl.DDLDatabase</name>
<inputSchema>PUBLIC</inputSchema>
<outputSchemaToDefault>true</outputSchemaToDefault>
<outputCatalogToDefault>true</outputCatalogToDefault>
<properties>
<property>
<key>sort</key>
<value>semantic</value>
</property>
<property>
<key>scripts</key>
<value>src/main/resources/db/migration/*</value>
</property>
<property>
<key>parseUnknownFunctions</key>
<value>IGNORE</value>
</property>
</properties>
</database>
<target>
<clean>true</clean>
<packageName>com.product</packageName>
<directory>${project.generated-sources}/jooq/src/main/java</directory>
</target>
</generator>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta-extensions</artifactId>
<version>${jooq.version}</version>
</dependency>
</dependencies>
</plugin>
解决方案
如果您查看完整的堆栈跟踪,您会发现错误不是由 jOOQ 引发的,而是由 H2 引发的:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "UUID_GENERATE_V4" not found; SQL statement:
create table CUSTOMER (ID uuid not null default UUID_GENERATE_V4(), NAME varchar(255) not null, primary key (ID)) [90022-200]
at org.h2.message.DbException.getJdbcSQLException (DbException.java:576)
at org.h2.message.DbException.getJdbcSQLException (DbException.java:429)
at org.h2.message.DbException.get (DbException.java:205)
at org.h2.message.DbException.get (DbException.java:181)
at org.h2.command.Parser.readJavaFunction (Parser.java:3565)
at org.h2.command.Parser.readFunction (Parser.java:3770)
at org.h2.command.Parser.readTerm (Parser.java:4305)
at org.h2.command.Parser.readFactor (Parser.java:3343)
at org.h2.command.Parser.readSum (Parser.java:3330)
at org.h2.command.Parser.readConcat (Parser.java:3305)
at org.h2.command.Parser.readCondition (Parser.java:3108)
at org.h2.command.Parser.readExpression (Parser.java:3059)
at org.h2.command.Parser.parseColumnForTable (Parser.java:5727)
at org.h2.command.Parser.parseTableColumnDefinition (Parser.java:8442)
at org.h2.command.Parser.parseCreateTable (Parser.java:8379)
at org.h2.command.Parser.parseCreate (Parser.java:6276)
at org.h2.command.Parser.parsePrepared (Parser.java:903)
at org.h2.command.Parser.parse (Parser.java:843)
at org.h2.command.Parser.parse (Parser.java:815)
at org.h2.command.Parser.prepareCommand (Parser.java:738)
at org.h2.engine.Session.prepareLocal (Session.java:657)
at org.h2.engine.Session.prepareCommand (Session.java:595)
at org.h2.jdbc.JdbcConnection.prepareCommand (JdbcConnection.java:1235)
at org.h2.jdbc.JdbcStatement.executeInternal (JdbcStatement.java:212)
at org.h2.jdbc.JdbcStatement.execute (JdbcStatement.java:201)
at org.jooq.tools.jdbc.DefaultStatement.execute (DefaultStatement.java:102)
at org.jooq.impl.SettingsEnabledPreparedStatement.execute (SettingsEnabledPreparedStatement.java:227)
at org.jooq.impl.AbstractQuery.execute (AbstractQuery.java:411)
at org.jooq.impl.AbstractQuery.execute (AbstractQuery.java:332)
at org.jooq.meta.extensions.ddl.DDLDatabase.load (DDLDatabase.java:183)
at org.jooq.meta.extensions.ddl.DDLDatabase.lambda$0 (DDLDatabase.java:156)
当前(jOOQ 3.15)实现DDLDatabase
将您的 DDL 转换为 H2 方言,并在内存数据库中的 H2 中运行它以模拟您的 DDL。H2 不支持此功能。未来的 jOOQ 版本将在不使用 H2 的情况下解释 DDL(请参阅https://github.com/jOOQ/jOOQ/issues/7034),但目前情况并非如此。
作为一种解决方法,您可以使用此处记录的 jOOQ 解析器忽略注释语法: https ://www.jooq.org/doc/latest/manual/code-generation/codegen-ddl/
具体来说:
create table customer (
id uuid not null
/* [jooq ignore start] */ default uuid_generate_v4() /* [jooq ignore stop] */,
name varchar(255) not null,
primary key (id)
);
或者(更好!)使用此处记录的基于测试容器的方法之一:https ://github.com/jOOQ/jOOQ/issues/6551或在此示例中:https ://github.com/jOOQ/jOOQ/tree/主/jOOQ-examples/jOOQ-testcontainers-example
推荐阅读
- c# - CloudBlobContainer.ListBlobs() 中如何使用前缀参数从 Azure Blob 存储中的虚拟文件夹获取文件
- java - 使用改造时我的注册有问题
- keras - 将代码转换为新的 keras 版本(功能 API)或如何连接 2 个模型
- excel - VBA UserForm - 工作分钟的自定义倒数计时器,但无法实现自定义秒数
- google-maps - Googlmap.getCameraPosition() 不适用于 iOS
- node.js - 使用 ioredis scanStream() 扫描所有 Redis 键时出现问题
- python - 从文本文件中读取列表并将其转换为字符串
- python - python + 如何知道谁删除了 python 模块
- python - Tf-idf 矢量化器在带有 char_wb 的特征词中有空格?
- css - 我如何在这里使用申请?