Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: sprocketsОтветов: 1

Я рассматриваю возможность использования 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?

javadatabasejooqddldialect

Ответы

Ответ 1 · Lukas Eder

Эта функция доступна через 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();

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы