【问题标题】:JOOQ for multiple profile多个配置文件的 JOOQ
【发布时间】:2019-08-04 06:20:39
【问题描述】:

最近我开始使用 jooq 作为我的 java 项目的数据库层。这是我的组织,我们的应用程序数据库有不同的数据库名称(即 DevOps 管道)。

请考虑以下信息:

  • 假设我的应用程序名称是 MY_APPLICATION
  • 假设 MY_APPLICATION 使用数据库 MY_DB(这是基于 MySQL 的,其中有一些表)。

让我们考虑以下信息来部署 MY_APPLICATION

  • 每当我们在开发配置文件中进行部署时,我们原来的 MY_DB 将变为 DEV_MY_DB(只有 DB 名称需要更改,表相同)。
  • 每当我们在阶段配置文件中进行部署时,我们原来的 MY_DB 将变为 STG_MY_DB。
  • 每当我们在生产配置文件中进行部署时,我们原来的 MY_DB 都会变成 PROD_MY_DB。

我想在构建时从 JOOQ 实现 MY_DB 代码生成(通过 Jenkins 构建作业)。如果我在开发配置文件上构建 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();
}

}

谁能帮我存档?

【问题讨论】:

    标签: java mysql jooq


    【解决方案1】:

    您可以通过三种方式实现这种类型的多租户:

    为每个环境生成代码

    您可以为每个环境重新生成架构。这样,您的 jOOQ 代码将始终引用它当前正在运行的环境。这可能有点脆弱,因为您将测试与交付到生产环境的代码不同的代码

    移除代码生成器中的架构信息

    您可以使用code generation schema mapping feature 告诉代码生成器不要在生成的代码中生成任何架构信息:

    .withInputSchema(p_schema_name)
    .withOutputSchemaToDefault(true) // That's it
    

    生成的代码现在将生成不合格的表名。此方法假定您在访问正确数据库的每个环境中使用不同的 JDBC 连接/URL。

    在运行时映射架构信息

    通过使用runtime schema mapping feature,您可以在运行时为每个环境转换所有生成代码的架构名称。

    生成的代码现在将生成具有映射架构限定的限定表名。

    【讨论】:

      猜你喜欢
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2011-01-05
      相关资源
      最近更新 更多