【问题标题】:jOOQ: Is there a restriction in the DDLDatabase generator for deferrable constraints?jOOQ:DDLDatabase 生成器中是否存在可延迟约束的限制?
【发布时间】:2019-10-28 06:13:00
【问题描述】:

我正在使用 Gradle 中的 DDLDatabase 生成器来生成 jOOQ 源。在涉及可延迟约束时,我似乎遇到了障碍。

从实时数据库生成相同的 DDL 工作...

这是我对 DDLDatabase 的配置:

jooq {
  version = "3.11.11"
  edition = "OSS"

  reference(sourceSets.main) {
    generator {
      database {
        name = "org.jooq.meta.extensions.ddl.DDLDatabase"
        properties {
          property {
            key = "scripts"
            value = "schema-gen/schema.sql"
          }
          property {
            key = "sort"
            value = "semantic"
          }
        }
        inputSchema = "REFERENCE"
      }
      generate {
        relations = true
        deprecated = false
        records = true
        immutablePojos = false
        fluentSetters = true
      }
      target {
        packageName = "com.octeris.aml.reference.persistence.jooq"
        directory = "jooq-gen"
      }
    }
  }
}

这是生成器偶然发现的 DDL 部分:

create table reference.a (
  id varchar(100) not null
 ,foo_id varchar(100)
 ,constraint a$c$p primary key (id)
 ,constraint a$f$1 foreign key (foo_id) references reference.b(id) on delete restrict on update restrict deferrable initially deferred
);

报错如下:

Token ')' expected: [8:106] ...rence.b(id) on delete restrict on update restrict [*]deferrable initially deferred

有人知道可以接受的替代语法吗?还是这可能是生成器中的错误?

【问题讨论】:

    标签: sql code-generation ddl jooq


    【解决方案1】:

    jOOQ 解析器还不能识别这种语法。我为此创建了一个功能请求: https://github.com/jOOQ/jOOQ/issues/8799

    jOOQ 3.11 解决方法

    目前,解决方法是在将 SQL 文件传递​​给DDLDatabase 之前对其进行预处理。您应该搜索deferrable initially deferred 语法并将其替换为空字符串。

    jOOQ 3.12 解决方法

    请注意,从即将推出的 jOOQ 3.12 开始,将有一个新的 jOOQ 特定的注释语法,您可以在其中注释这些语法元素仅为 jOOQ 解析器,同时它们继续由您的数据库执行。功能要求是这样的: https://github.com/jOOQ/jOOQ/issues/8325

    该功能将像这样工作(这是将在数据库中执行的内容):

    create table reference.a (
      id varchar(100) not null
     ,foo_id varchar(100)
     ,constraint a$c$p primary key (id)
     ,constraint a$f$1 
        foreign key (foo_id) 
        references reference.b(id) 
        on delete restrict 
        on update restrict 
        -- [jooq ignore start]
        deferrable initially deferred
        -- [jooq ignore stop]
    );
    

    jOOQ 将忽略这两个标记之间的所有内容,所以这将是 jOOQ 解析的内容

    create table reference.a (
      id varchar(100) not null
     ,foo_id varchar(100)
     ,constraint a$c$p primary key (id)
     ,constraint a$f$1 
        foreign key (foo_id) 
        references reference.b(id) 
        on delete restrict 
        on update restrict 
        -- [jooq ignore start]
        -- [ ... ignored ... ]
        -- [jooq ignore stop]
    );
    

    SQL 不需要以这种方式格式化。我只是在这里为这个问题做了这个。您还可以在单​​行 SQL 语句中使用 /* [jooq ignore start] */

    界定jOOQ要忽略的部分的确切标记可以通过以下方式指定:

    • Settings.parseIgnoreCommentStart
    • Settings.parseIgnoreCommentStop

    【讨论】:

    • 谢谢。 3.12 有粗略的预计到达时间吗?我已经看到里程碑的“完成百分比”是 85%,所以我估计还需要几个月的时间,对吗?
    • 应该在6月/7月19日发布
    • 酷,比预想的要快——期待!
    猜你喜欢
    • 2020-04-19
    • 2012-04-28
    • 2010-11-03
    • 2012-01-25
    • 2013-04-25
    • 2010-11-03
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多