JOOQ 3.15.3使用无库名JDBC连接时如何指定查询使用的数据库
问题根因
MySQL本身不支持独立的catalog和schema概念,JOOQ对MySQL的默认适配逻辑是将数据库名作为catalog处理,而非schema,你之前所有针对schema的配置都不会生效,这是所有异常的核心原因。
场景1:已开启<outputSchemaToDefault>true</outputSchemaToDefault>生成代码
开启该参数后生成的表对象未绑定任何源catalog/schema,直接配置默认catalog即可:
new Settings() .withRenderCatalog(true) // 必须开启才会渲染catalog前缀 .withRenderMapping(new RenderMapping() .withDefaultCatalog("my_database") // 配置实际使用的数据库名即可 );
配置后JOOQ会自动给所有无catalog的表拼接my_database.前缀,不会再报no database selected错误。
场景2:未开启outputSchemaToDefault,使用本地库名生成代码
假设本地生成代码用的库名是local_db,需要映射到生产环境的my_database,直接配置catalog映射规则即可:
new Settings() .withRenderCatalog(true) .withRenderMapping(new RenderMapping() .withCatalogs(new MappedCatalog() .withInput("local_db") // 填写本地生成代码时用的库名 .withOutput("my_database") // 填写生产环境实际库名 ) );
你之前遇到库名重复拼接的问题,就是因为同时配置了schema映射规则,JOOQ把库名同时作为catalog和schema两次拼接导致的,删除所有schema相关的映射配置即可解决。
关于断点SQL可正常执行但JOOQ执行失败的说明
你断点拿到的是JOOQ已经完成渲染的完整SQL(带正确的库名前缀),但实际执行时因为你之前的配置错误,JOOQ会在预编译阶段替换掉正确的库名前缀、或者未渲染前缀,才会出现执行失败的情况,按照上述方案调整配置后即可恢复正常。
注意事项
所有针对MySQL的库名映射逻辑,一律操作catalog相关配置,不要额外配置schema相关参数,避免出现逻辑冲突。
内容的提问来源于stack exchange,提问作者mkv-ts
相关产品推荐
相关产品推荐

