我认为现在在开发过程中使用一个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使用相同的flyway初始化/迁移脚本。
答案 0 :(得分:9)
您不需要为每个生产环境生成两组类。 jOOQ生成的类与供应商无关,除非您使用特定于供应商的功能,例如像MariaDB的enum
类型或存储过程等
您获得的错误可能与以下之一有关:
PUBLIC
架构。您可以确保模式名称在H2和MariaDB之间匹配,也可以在配置中使用Settings.renderSchema
或使用schema mapping关闭jOOQ中的模式名称生成。Settings.renderNameStyle
完成,并将其设置为AS_IS
你说:
我认为现在在开发过程中使用一个RDBMS并在生产中使用另一个RDBMS是很常见的。我想在开发中使用H2,在生产中使用MariaDB来实现Spring Boot和基于JOOQ的应用程序。
我真的很反对这种做法。您可以非常轻松地在docker中设置生产数据库并直接使用它。虽然H2可以模拟几个MariaDB功能,但它远不一样。通过人为地将自己限制在H2和MariaDB之间的最小公分母,你错过了许多很酷的MariaDB功能,包括CTE,窗口函数,存储过程等等。你会不断地对抗之间的细微差别。各种级别的供应商。
您应该只在以下时间执行此操作: