【问题标题】:Jooq dynamically change db's schema in generated queryJooq 在生成的查询中动态更改数据库的模式
【发布时间】:2017-11-11 08:29:12
【问题描述】:

我在简单数据库中有 2 个类似的模式 - “开发”和“阶段”。我已经使用 Jooq 为其中一种模式生成了 Java 类(例如“开发”)。当 jooq 生成对 db 的查询时,它会隐式地将模式的名称添加到所有查询的别名中

select "develop"."image"."id", "develop"."image"."image_data" 
from "develop"."image" 
where "develop"."image"."id" = ?

所以我的问题是,是否有办法在生成的查询中更改 jooq 模式名称(以“stage”为例)而不为“stage”模式重新生成 jooq 的类?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    您有多种选择,甚至可以组合使用:

    使用代码生成器的架构映射功能

    如果您想避免将 "develop" 架构名称硬连接到生成的类中,您可以将其重写为其他架构名称,如下所示:

    <configuration>
      <generator>
        <database>
          <schemata>
            <schema>
              <inputSchema>develop</inputSchema>
              <outputSchema>stage</outputSchema>
            </schema>
          ...
    

    当然,这只是推迟了问题,因为模式名称仍在生成的代码中。您可以使用以下选项从生成的代码中完全删除名称:

    <configuration>
      <generator>
        <database>
          <schemata>
            <schema>
              <inputSchema>develop</inputSchema>
              <outputSchemaToDefault>true</outputSchemaToDefault>
            </schema>
          ...
    

    现在这将从生成的代码中删除所有架构引用,因此生成的类可以在所有架构上运行(当然,请确保使用正确的连接和 search_path!)

    我认为这是您的最佳选择

    更多细节在这里: https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-catalog-and-schema-mapping/

    使用运行时架构映射功能

    您可以保留生成的代码,并在运行时使用Settings(您提供给您的jOOQ运行时Configuration)重写所有对象引用。同样,您有两个相同的选择:

    映射架构名称:

    new Settings().withRenderMapping(new RenderMapping()
      .withSchemata(new MappedSchema()
        .withInput("develop")
        .withOutput("stage")
      )
    );
    

    删除所有架构名称:

    new Settings().withRenderSchema(false);
    

    更多细节在这里: https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-render-mapping/

    【讨论】:

    • 我认为最好的机制是在代码生成时使用&lt;outputSchemaToDefault&gt;true&lt;/outputSchemaToDefault&gt;。所以稍后根据您的连接查询将在任何数据库上运行。
    • @ChathurikaSandarenu 这取决于您如何设置架构以及您喜欢如何工作。幸运的是,所有这些选项都是可能的,因此每个人都可以选择最适合自己的选项。
    猜你喜欢
    • 2021-08-23
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多