jOOQ: есть ли ограничение в генераторе DDLDatabase для отложенных ограничений? - PullRequest
1 голос
/ 13 июня 2019

Я использую генератор DDLDatabase из Gradle для генерации 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

Кто-нибудь знает альтернативный синтаксис, который будет принят? Или это потенциально ошибка в генераторе?

1 Ответ

0 голосов
/ 13 июня 2019

Парсер 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 не нужно форматировать таким образом. Я только что сделал это для этого вопроса здесь. Вы также можете использовать /* [jooq ignore start] */ для однострочного оператора SQL.

Точный токен, который разделяет части, которые должны быть проигнорированы jOOQ, может быть указан:

  • Settings.parseIgnoreCommentStart
  • Settings.parseIgnoreCommentStop
...