Генерация схемы из метамодели JOOQ в другом диалекте SQLDialect

Я рассматриваю возможность использования jOOQ в качестве безопасного для типов, независимого от диалекта БД генератора SQL, поскольку мне нужно создать небольшой DDL-скрипт базы данных и большое количество операторов INSERT и UPDATE на лету из более крупного приложения. Затем мы предоставляем файл(ы) для загрузки.

Я создал начальную схему БД вручную в MySQL и сгенерировал классы jOOQ для работы с ней. В настоящее время JOOQ используется для создания набора вставок в пустую схему MySql). Это прекрасно работает.

Я хотел бы предложить пользователю выбор различных схем БД для экспорта в: sqlite, MySQL/Maria, Postgres, а если лицензия коммерческая, то, возможно, Access, Oracle и т.д.

    List<DSLContext> dbdialects = new ArrayList<DSLContext>();
    dbdialects.add(using(SQLDialect.MYSQL));
    dbdialects.add(using(SQLDialect.FIREBIRD));
    dbdialects.add(using(SQLDialect.SQLITE));
    //other dialects including MS Access available via commercial license.

    for (DSLContext create : dbdialects) {

        String dialect = create.configuration().dialect().toString();
        String sql = create.insertInto(EMPLOYEES)
                .set(EMPLOYEES.FIRST_NAME, fn)
                .set(EMPLOYEES.LAST_NAME, ln)
                .getSQL(ParamType.INLINED);
        System.out.println(dialect + "\t" + sql);
    }

Конечно, я могу воссоздать базовую схему вручную для каждой СУБД, но это утомительно, подвержено ошибкам и кажется излишним: нет ли умного способа использовать сгенерированную метамодель из jOOQ, которую я создал с моей схемой БД MySQL для генерации схема для других диалектов SQL?


person sprockets    schedule 26.09.2014    source источник


Ответы (1)


Эта функция доступна через DSLContext.ddl(), которые были добавлены в jOOQ 3.8 с #3160.

Чтобы генерировать и выполнять DDL-запросы (CREATE TABLE, ALTER TABLE ADD CONSTRAINT и т. д.), просто передайте имя таблицы или имя схемы методу ddl() как таковому:

Queries queries = DSL.using(configuration).ddl(EMPLOYEES);
for (Query query : queries)
    query.execute();
person Lukas Eder    schedule 29.09.2014
comment
Спасибо за отзыв - мы обязательно будем держать этот фреймворк в поле нашего зрения! - person sprockets; 30.09.2014
comment
@sprockets: Отлично! Я хотел бы узнать больше о вашем интересном примере использования. Если вам нужно быстро поболтать, пожалуйста, свяжитесь с нами. - person Lukas Eder; 30.09.2014
comment
Есть ли прогресс в последней версии? - person Peter Penzov; 08.06.2017
comment
@PeterPenzov: Да, эти функции доступны начиная с версии jOOQ 3.8. я обновил ответ - person Lukas Eder; 08.06.2017