Как охватить запрос таблицы переименования MySQL JOOQ в той же базе данных?

У меня есть приложение scala, которое управляет несколькими схемами базы данных MySQL, включая изменение (добавление, переименование и т. д.) Таблиц. Команды выдаются через пул соединений, который подключается к общей базе данных управления на сервере базы данных.

Поскольку приложение предназначено для работы с несколькими базами данных, я использую JOOQ для рендеринга SQL-запросов (выполнение выполняется через отдельный модуль JDBC).

У меня проблемы с JOOQ alterTable(...).renameTo(...) DSL - рассмотрим следующий пример:

У нас есть таблица TestTable в базе данных TestDatabase. Допустим, я хочу просто переименовать эту таблицу в «Foo», сохранив ее в «TestDatabase».

Этот код:

...
val context = DSL.using(SQLDialect.MYSQL_5_7)
val query = context
              .alterTable(table(name("TestDatabase", "TestDatabase")))
              .renameTo(name("TestDatabase", "Foo"))
...

Генерирует: ALTER TABLE `TestDatabase`.`TestTable` RENAME TO `Foo` Однако, поскольку пул соединений, который я использую, подключен к моей базе данных управления, он просто переименовывает таблицу в "Foo" и перемещает это моей базы данных управления. Я ожидал, что SQL будет: ALTER TABLE `TestDatabase`.`TestTable` RENAME TO `TestDatabase`.`Foo`. Я пробовал множество альтернатив, чтобы вызвать метод .renameTo и убедить его использовать полное имя, но безрезультатно:

  • .renameTo(table(name(...) -> такое же поведение.
  • .renameTo("`TestDatabase`.`Foo`") -> Экранирует имя с помощью обратных кавычек, обрабатывает его как одно имя, а не как полное имя.

Мне интересно, не хватает ли мне чего-то, это предполагаемое поведение или, может быть, даже ошибка или конструктивный недостаток JOOQ.

Есть ли способ переименовать таблицу, используя полностью определенные имена?

Спасибо!

Вы пробовали использовать необработанные соединения jdbc?

Mon Calamari 08.11.2018 16:13

@MonCalamari Это, конечно, работает, однако этот вопрос конкретно касается сохранения абстракции JOOQ для поддержки перекрестной БД, иначе мне пришлось бы переместить этот код в конкретный код БД для каждой БД, которую я хочу поддерживать.

Dominic 08.11.2018 16:17

На вашем месте я бы поднял вопрос с github.com/jOOQ/jOOQ

Mon Calamari 08.11.2018 16:21

@MonCalamari Спасибо, я учту.

Dominic 08.11.2018 16:51
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
5
4
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ошибка в jOOQ: https://github.com/jOOQ/jOOQ/issues/8042

Ваш обходной путь близок. Это не работает:

.renameTo("`TestDatabase`.`Foo`")

Как вы заметили, за кулисами API DSL.name() используется для обертывания имени цели, потому что метод renameTo() не реализует простой API шаблонов SQL. Однако вы можете явно использовать простой шаблон SQL, написав в качестве обходного пути:

.renameTo(table("`TestDatabase`.`Foo`"))

Другие вопросы по теме