我有一个scala应用程序,该应用程序管理多个MySQL数据库架构,其中包括修改(添加,重命名等)表。这些命令是通过连接池发出的,该连接池连接到数据库服务器中的通用管理数据库。
因为该应用程序被设计为跨数据库的,所以我使用JOOQ来呈现SQL查询(执行是通过单独的JDBC模块完成的)。
我遇到了JOOQ 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"))
...
Run Code Online (Sandbox Code Playgroud)
生成: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的错误或设计缺陷。
有没有办法使用完全限定的名称来重命名表?
谢谢!
这是 jOOQ 中的一个错误:https ://github.com/jOOQ/jOOQ/issues/8042
您的解决方法很接近。这不起作用:
.renameTo("`TestDatabase`.`Foo`")
Run Code Online (Sandbox Code Playgroud)
正如您所注意到的,在幕后,DSL.name()API 用于包装目标名称,因为该renameTo()方法没有实现普通的 SQL 模板 API。但是,您可以通过编写以下解决方法来显式使用纯 SQL 模板:
.renameTo(table("`TestDatabase`.`Foo`"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |