Как выполнить запрос таблицы переименования MySQL JOOQ к той же базе данных? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть приложение 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.

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

Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

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

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

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

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

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