【问题标题】:JOOQ not ignoring unknown function despite configuration尽管配置,JOOQ 不会忽略未知功能
【发布时间】:2021-08-24 15:56:14
【问题描述】:

我的 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 时应该禁用此行为。这似乎没有任何效果。

我还知道有一种解决方法可以通过在其上添加 cmets 使 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 jooq-codegen-maven


    【解决方案1】:

    如果您查看完整的堆栈跟踪,您会发现错误不是由 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)
    

    DDLDatabase 的当前 (jOOQ 3.15) 实现将您的 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/main/jOOQ-examples/jOOQ-testcontainers-example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2014-08-19
      • 2017-10-01
      • 2012-05-02
      • 2019-05-12
      • 1970-01-01
      • 2023-02-25
      相关资源
      最近更新 更多