繁体   English   中英

如何将MySQL JOOQ重命名表查询范围扩展到同一个数据库?

[英]How to scope a MySQL JOOQ rename table query to the same database?

我有一个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 TABLE `TestDatabase`.`TestTable` RENAME TO `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的错误或设计缺点。

有没有办法使用完全限定名称重命名表?

谢谢!

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

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

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

正如您已经注意到的那样,在幕后, DSL.name() API用于包装目标名称,因为renameTo()方法不实现纯SQL模板API 但是,您可以通过编写解决方法明确使用纯SQL模板:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM