使用生成的 JOOQ 代码定位多种数据库类型
Targeting multiple database types with generated JOOQ code
我想现在在开发过程中使用一个 RDBMS 而在生产过程中使用另一个 RDBMS 是很常见的。我想在开发中使用 H2,在生产中使用 MariaDB 来构建基于 Spring Boot 和 JOOQ 的应用程序。
是否有一些聪明的方法可以使生成的相同 JOOQ 代码在开发和生产环境中都能工作,或者我是否需要根据目标环境生成两组代码?如果后者是真的,如何以理智的方式做到这一点,例如使用 nu.studer.jooq
gradle 插件?
每当我尝试对 MariaDB 服务器使用从 H2 数据库生成的源时,都会抛出这样的异常:
org.mariadb.jdbc.internal.util.dao.QueryException: SELECT command denied to user 'foo'@'localhost' for table 'FOO'
Query is: select `PUBLIC`.`FOO`.`ID`, `PUBLIC`.`FOO`.`NAME`, `PUBLIC`.`FOO`.`INFO` from `PUBLIC`.`FOO`
我对 H2 和 MariaDB 使用相同的飞行路径 initialization/migration 脚本。
您不需要为每个生产环境生成两组 类。 jOOQ 生成的 类 与供应商无关,除非您使用特定于供应商的功能,例如比如 MariaDB 的 enum
类型或者存储过程等
您遇到的错误可能与以下情况之一有关:
- 您的 MariaDB 数据库中可能没有
PUBLIC
架构。您可以确保模式名称在 H2 和 MariaDB 之间匹配,或者您可以使用 Settings.renderSchema
on your configuration, or by using a schema mapping. 关闭 jOOQ 中的模式名称生成
- 不同的数据库有不同的默认区分大小写设置。在 H2 中,默认情况下,所有 table 都是大写的,但在您的 MariaDB 安装中可能不是这种情况。您可以确保两个数据库中的大小写相同,或者关闭反引号/引号的生成。这可以通过
Settings.renderNameStyle
来完成,将其设置为 AS_IS
- 它可能与 jOOQ 无关,您只是没有适当的权限来查询 table。
无关,关于使用不同供应商进行开发和生产的简短说明
你说:
I imagine that it nowadays is quite common to use one RDBMS during development and another RDBMS in production. I'd like to use H2 in development and MariaDB in production for a Spring Boot and JOOQ based application.
我真的非常反对这种做法。您可以非常轻松地在 docker 中设置您的生产数据库并直接对其进行操作。虽然 H2 可以模拟一些 MariaDB 功能,但它远不相同。通过人为地将自己限制在 H2 和 MariaDB 之间的最小公分母,你会错过很多很酷的 MariaDB 功能,包括 CTE、window 函数、存储过程等。你会不断地与不同层级的供应商之间存在细微差别。
你应该只在以下情况下这样做:
- 您实际上需要在生产中支持多个数据库
- 你真的真的真的从性能的略微提高中受益,例如用于集成测试(但我对此表示怀疑,docker)。
我想现在在开发过程中使用一个 RDBMS 而在生产过程中使用另一个 RDBMS 是很常见的。我想在开发中使用 H2,在生产中使用 MariaDB 来构建基于 Spring Boot 和 JOOQ 的应用程序。
是否有一些聪明的方法可以使生成的相同 JOOQ 代码在开发和生产环境中都能工作,或者我是否需要根据目标环境生成两组代码?如果后者是真的,如何以理智的方式做到这一点,例如使用 nu.studer.jooq
gradle 插件?
每当我尝试对 MariaDB 服务器使用从 H2 数据库生成的源时,都会抛出这样的异常:
org.mariadb.jdbc.internal.util.dao.QueryException: SELECT command denied to user 'foo'@'localhost' for table 'FOO'
Query is: select `PUBLIC`.`FOO`.`ID`, `PUBLIC`.`FOO`.`NAME`, `PUBLIC`.`FOO`.`INFO` from `PUBLIC`.`FOO`
我对 H2 和 MariaDB 使用相同的飞行路径 initialization/migration 脚本。
您不需要为每个生产环境生成两组 类。 jOOQ 生成的 类 与供应商无关,除非您使用特定于供应商的功能,例如比如 MariaDB 的 enum
类型或者存储过程等
您遇到的错误可能与以下情况之一有关:
- 您的 MariaDB 数据库中可能没有
PUBLIC
架构。您可以确保模式名称在 H2 和 MariaDB 之间匹配,或者您可以使用Settings.renderSchema
on your configuration, or by using a schema mapping. 关闭 jOOQ 中的模式名称生成
- 不同的数据库有不同的默认区分大小写设置。在 H2 中,默认情况下,所有 table 都是大写的,但在您的 MariaDB 安装中可能不是这种情况。您可以确保两个数据库中的大小写相同,或者关闭反引号/引号的生成。这可以通过
Settings.renderNameStyle
来完成,将其设置为AS_IS
- 它可能与 jOOQ 无关,您只是没有适当的权限来查询 table。
无关,关于使用不同供应商进行开发和生产的简短说明
你说:
I imagine that it nowadays is quite common to use one RDBMS during development and another RDBMS in production. I'd like to use H2 in development and MariaDB in production for a Spring Boot and JOOQ based application.
我真的非常反对这种做法。您可以非常轻松地在 docker 中设置您的生产数据库并直接对其进行操作。虽然 H2 可以模拟一些 MariaDB 功能,但它远不相同。通过人为地将自己限制在 H2 和 MariaDB 之间的最小公分母,你会错过很多很酷的 MariaDB 功能,包括 CTE、window 函数、存储过程等。你会不断地与不同层级的供应商之间存在细微差别。
你应该只在以下情况下这样做:
- 您实际上需要在生产中支持多个数据库
- 你真的真的真的从性能的略微提高中受益,例如用于集成测试(但我对此表示怀疑,docker)。