如何将mysql jooq rename表查询限定到同一个数据库?

uurity8g  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(311)

我有一个scala应用程序,它管理多个mysql数据库模式,其中包括修改(添加、重命名等)表。这些命令通过连接到数据库服务器中的通用管理数据库的连接池发出。
因为应用程序被设计成跨数据库的,所以我使用jooq来呈现sql查询(通过单独的jdbc模块执行)。
我遇到了jooqs的问题 alterTable(...).renameTo(...) dsl—考虑以下示例:
我们在数据库“testdatabase”中有一个表“testtable”。假设我只想将该表重命名为“foo”,将其保存在“testdatabase”中。
此代码:

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

生成: ALTER TABLETestDatabase.TestTableRENAME TOFoo但是,由于我使用的连接池连接到我的管理数据库,所以它只是将表重命名为“foo”并将其移动到我的管理数据库。我希望sql是: `ALTER TABLE `TestDatabase`.`TestTable` RENAME TO `TestDatabase`.`Foo . 我尝试了各种各样的方法来调用 .renameTo 方法并将其转换为使用完全限定名,但无效: .renameTo(table(name(...) ->同样的行为。 .renameTo("TestDatabase.Foo") ->用反勾号转义名称,将其视为一个名称而不是限定名称。
我想知道我是否遗漏了什么,这是否是预期的行为,或者甚至可能是jooq的bug或设计缺陷。
有没有办法用完全限定名重命名表?
谢谢您!

gdrx4gfi

gdrx4gfi1#

这是jooq中的一个bug:https://github.com/jooq/jooq/issues/8042
你的解决方法很接近了。这不起作用:

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

正如你所注意到的,在幕后 DSL.name() api用于 Package 目标名称,因为 renameTo() 方法未实现普通sql模板api。但是,您可以通过编写来显式使用纯sql模板作为解决方法:

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

相关问题