在没有访问 mysql 数据库的情况下使用 maven jooq codegen 插件
Using maven jooq codegen plugin without the access to mysql database
我们正在使用 jooq codegen 插件为 MySQL 数据库之一生成 dao 和 pojo 类。配置如下:
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>3.14.3</version>
<configuration>
<jdbc>
<driver>com.mysql.jdbc.Driver</driver>
<url>MYSQL_HOST</url>
<user>MYSQL_USER</user>
<password>MYSQL_PASSWORD</password>
</jdbc>
<generator>
<database>
<includes>some_db.*</includes>
</database>
<generate>
<daos>true</daos>
<pojos>true</pojos>
</generate>
<target>
<packageName>mysql</packageName>
<directory>target/generated-sources</directory>
</target>
</generator>
</configuration>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
当插件的生成目标被触发时,它失败并出现以下错误:
Error running jOOQ code generation tool: Error generating code for catalog: org.jooq.exception.DataAccessException: SQL [select mysql.proc.db as ROUTINE_SCHEMA, mysql.proc.name as ROUTINE_NAME, mysql.proc.comment as ROUTINE_COMMENT, mysql.proc.param_list, mysql.proc.returns, mysql.proc.type as ROUTINE_TYPE from mysql.proc where mysql.proc.db in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) order by 1, 2, 6]; SELECT command denied to user 'MYSQL_USER'@'some_ip' for table 'proc' -> [Help 1]
请注意,用户 MYSQL_USER 没有也不能访问 mysql
数据库。有什么方法可以让我们继续使用 codegen 插件吗?
更新:尝试使用与插件版本 3.10.5
相同的配置。没有错误。
为什么 jOOQ 访问 mysql
数据库
除了访问 information_schema
和 mysql
数据库之外,jOOQ 没有其他方法可以对您的实时 MySQL 数据库进行逆向工程,这些数据库包含 jOOQ 代码生成器所需的元数据.
关闭例程生成
如果您不能向您的代码生成器用户授予必要的授权,那么相关查询将根本无法工作。异常 可以 被视为装饰性的,因为代码生成器随后将简单地跳过为您的存储过程生成代码。
您可以通过指定关闭例程的生成:
<includeRoutines>false</includeRoutines>
改用本地测试数据库
或者,为什么要使用您的生产数据库来生成 jOOQ 代码,when you can setup a testcontainers database specifically for the code generation task?无论如何,您可能正在使用测试容器或其他类似产品进行集成测试,因此为代码生成器设置模式应该不会有太多额外的工作吗?
我们正在使用 jooq codegen 插件为 MySQL 数据库之一生成 dao 和 pojo 类。配置如下:
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>3.14.3</version>
<configuration>
<jdbc>
<driver>com.mysql.jdbc.Driver</driver>
<url>MYSQL_HOST</url>
<user>MYSQL_USER</user>
<password>MYSQL_PASSWORD</password>
</jdbc>
<generator>
<database>
<includes>some_db.*</includes>
</database>
<generate>
<daos>true</daos>
<pojos>true</pojos>
</generate>
<target>
<packageName>mysql</packageName>
<directory>target/generated-sources</directory>
</target>
</generator>
</configuration>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
当插件的生成目标被触发时,它失败并出现以下错误:
Error running jOOQ code generation tool: Error generating code for catalog: org.jooq.exception.DataAccessException: SQL [select mysql.proc.db as ROUTINE_SCHEMA, mysql.proc.name as ROUTINE_NAME, mysql.proc.comment as ROUTINE_COMMENT, mysql.proc.param_list, mysql.proc.returns, mysql.proc.type as ROUTINE_TYPE from mysql.proc where mysql.proc.db in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) order by 1, 2, 6]; SELECT command denied to user 'MYSQL_USER'@'some_ip' for table 'proc' -> [Help 1]
请注意,用户 MYSQL_USER 没有也不能访问 mysql
数据库。有什么方法可以让我们继续使用 codegen 插件吗?
更新:尝试使用与插件版本 3.10.5
相同的配置。没有错误。
为什么 jOOQ 访问 mysql
数据库
除了访问 information_schema
和 mysql
数据库之外,jOOQ 没有其他方法可以对您的实时 MySQL 数据库进行逆向工程,这些数据库包含 jOOQ 代码生成器所需的元数据.
关闭例程生成
如果您不能向您的代码生成器用户授予必要的授权,那么相关查询将根本无法工作。异常 可以 被视为装饰性的,因为代码生成器随后将简单地跳过为您的存储过程生成代码。
您可以通过指定关闭例程的生成:
<includeRoutines>false</includeRoutines>
改用本地测试数据库
或者,为什么要使用您的生产数据库来生成 jOOQ 代码,when you can setup a testcontainers database specifically for the code generation task?无论如何,您可能正在使用测试容器或其他类似产品进行集成测试,因此为代码生成器设置模式应该不会有太多额外的工作吗?