最近我开始使用 jooq 作为我的 java 项目的数据库层。这是我的组织,我们的应用程序数据库有不同的数据库名称(即 DevOps 管道)。
请考虑以下信息:
- 假设我的应用名称是 MY_APPLICATION。
- 假设MY_APPLICATION使用数据库MY_DB(这是基于MySQL的,里面有一些表)。
让我们考虑以下用于部署 MY_APPLICATION 的信息:
- 每当我们在开发配置文件中部署时,我们原来的 MY_DB 将变为 DEV_MY_DB(只需更改数据库名称,表相同)。
- 每当我们在阶段配置文件中进行部署时,我们原来的 MY_DB 都会变成 STG_MY_DB。
- 每当我们在生产配置文件中进行部署时,我们原来的 MY_DB 都会变成 PROD_MY_DB。
我想在构建时从 JOOQ 实现 MY_DB 代码生成(通过 Jenkin 构建作业)。如果我在开发配置文件上构建MY_APPLICATION,JOOQ应该为模式名称DEV_MY_DB生成数据库类。对于阶段和产品也是如此。
这是我正在使用的 JOOQ 代码生成实用程序。
public static void init(String p_catalog_name, String p_schema_name, String p_db_username,
String p_db_password, String p_db_url) {
Target l_target = new Target();
l_target.setDirectory("IdeaProjects/paas/css/src/main/java");
l_target.setPackageName("com.myorg.paas.css.db.entity");
Configuration configuration =
new Configuration()
.withJdbc(
new Jdbc()
.withDriver("com.mysql.cj.jdbc.Driver")
.withUrl(p_db_url)
.withUser(p_db_username)
.withPassword(p_db_password)
)
.withGenerator(
new Generator()
.withDatabase(
new Database()
.withName("org.jooq.meta.mysql.MySQLDatabase")
.withIncludes(".*")
.withExcludes("")
//.withInputCatalog(p_catalog_name)
.withInputSchema(p_schema_name)
.withForcedTypes(
new ForcedType()
.withUserType("java.time.LocalDateTime")
.withConverter(
"com.paas.css.startup.jooq.TimestampToLocalDateTime")
.withExpression(
"created_at | updated_at | start_date "
+ "| end_date | start_time | end_time | "
+ "next_trigger_start_at | next_trigger_end_at")
.withTypes(".*"),
new ForcedType()
.withUserType("com.paas.css.utils.DefaultMap")
.withConverter(
"com.paas.css.startup.jooq.ObjectToJsonMapConverter")
.withExpression(
"running_days | transaction_details | "
+ "| reward_details | triggers | life ")
.withTypes(".*")))
.withTarget(l_target));
try {
GenerationTool.generate(configuration);
} catch (Exception ex) {
System.out.println();
ex.printStackTrace();
}
}
有人可以帮我存档吗?
最佳答案
您可以通过三种方式实现这种类型的 Multi-Tenancy :
为每个环境生成代码
您可以为每个环境重新生成架构。这样,您的 jOOQ 代码将始终引用它当前运行的环境。这可能有点脆弱,因为您将测试与要交付生产的代码不同的代码
删除代码生成器中的架构信息
您可以使用 code generation schema mapping feature 告诉代码生成器不要在生成的代码中生成任何架构信息。 :
.withInputSchema(p_schema_name)
.withOutputSchemaToDefault(true) // That's it
生成的代码现在将生成不合格的表名称。此方法假设您在访问正确数据库的每个环境上使用不同的 JDBC 连接/URL。
在运行时映射架构信息
通过使用runtime schema mapping feature ,您可以在运行时为每个环境翻译所有生成的代码的架构名称。
生成的代码现在将生成具有映射模式限定的限定表名称。
关于java - JOOQ 多个配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144163/