如何将 MySQL JOOQ 重命名表查询范围限定为同一个数据库?

Posted

技术标签:

【中文标题】如何将 MySQL JOOQ 重命名表查询范围限定为同一个数据库?【英文标题】:How to scope a MySQL JOOQ rename table query to the same database? 【发布时间】:2019-04-12 03:00:39 【问题描述】:

我有一个管理多个 mysql 数据库模式的 scala 应用程序,其中包括修改(添加、重命名等)表。这些命令通过一个连接池发出,该连接池连接到数据库服务器中的通用管理数据库。

因为应用程序被设计为跨数据库,所以我使用 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"))
...

生成: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 连接吗? @MonCalamari 当然可以,但是,这个问题专门关于保持 JOOQ 抽象以实现跨数据库支持,否则我必须将此代码移动到我想要的每个数据库的数据库特定代码中支持。 如果我是你,我会向github.com/jOOQ/jOOQ提出问题 @MonCalamari 谢谢,我会考虑的。 【参考方案1】:

这是 jOOQ 中的一个错误:https://github.com/jOOQ/jOOQ/issues/8042

您的解决方法很接近。这不起作用:

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

您已经注意到,在幕后,DSL.name() API 用于包装目标名称,因为renameTo() 方法没有实现plain SQL templating API。但是,您可以通过编写作为解决方法来显式使用纯 SQL 模板:

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

【讨论】:

以上是关于如何将 MySQL JOOQ 重命名表查询范围限定为同一个数据库?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL重命名表

如何在 MySQL 的一个原子操作中重命名两个表

如何从 SQL 查询配置 jOOQ 可嵌入类型

如何查询以日期命名的表范围

使用 JOOQ 查询 mysql 中的 json 字段

如何在mysql中重命名数据库? [复制]