У меня есть приложение 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.
Есть ли способ переименовать таблицу, используя полностью определенные имена?
Спасибо!
@MonCalamari Это, конечно, работает, однако этот вопрос конкретно касается сохранения абстракции JOOQ для поддержки перекрестной БД, иначе мне пришлось бы переместить этот код в конкретный код БД для каждой БД, которую я хочу поддерживать.
На вашем месте я бы поднял вопрос с github.com/jOOQ/jOOQ
@MonCalamari Спасибо, я учту.






Это ошибка в jOOQ: https://github.com/jOOQ/jOOQ/issues/8042
Ваш обходной путь близок. Это не работает:
.renameTo("`TestDatabase`.`Foo`")
Как вы заметили, за кулисами API DSL.name() используется для обертывания имени цели, потому что метод renameTo() не реализует простой API шаблонов SQL. Однако вы можете явно использовать простой шаблон SQL, написав в качестве обходного пути:
.renameTo(table("`TestDatabase`.`Foo`"))
Вы пробовали использовать необработанные соединения jdbc?