【问题标题】:JOOQ keep setting schema to default PUBLICJOOQ 继续将架构设置为默认的 PUBLIC
【发布时间】:2018-08-15 15:30:35
【问题描述】:

我的 gradle.build(使用 nu.studer.jooq 插件)

jooq {
    MyProject(sourceSets.main) {
        generator {
            database {
                name = 'org.jooq.meta.extensions.ddl.DDLDatabase'
                properties {
                    property {
                        key = 'scripts'
                        value = 'src/main/resources/database.sql'
                    }
                }
                inputSchema = ''
                outputSchema = 'something'
//                schemata {
//                    schema {
//                        inputSchema = ""    // I've tried this too
//                        outputSchema = 'something'
//                    }
//                }
                forcedTypes {
                    forcedType {
                        name = 'varchar'
                        expression = '.*'
                        types = 'JSONB?'
                    }
                    forcedType {
                        name = 'varchar'
                        expression = '.*'
                        types = 'INET'
                    }
                }
            }
            generate {
                relations = true
                springAnnotations = true
                deprecated = false
                fluentSetters = true
                // ...
            }
            target {
                packageName = 'com.springforum'
            }
        }
    }
}

在构建过程中,它可以很好地生成模式,但即使我设置了 outputSchema,它仍然使用PUBLIC 模式作为输出(我尝试使用空字符串和非空字符串)


更新:仅当inputSchema 为空时才会出现问题,我尝试使用另一个带有架构的 sql 脚本,它按预期工作

【问题讨论】:

  • 为什么将inputSchema 留空?这是不允许的。但是你想用它来实现什么?
  • 因为我的 sql 文件不使用模式(它是从 pg_dump 生成的,并且没有选项可以更改它),例如:CREATE TABLE table_name ();。我通过手动添加架构解决了这个问题,但我希望有办法让我这样做
  • 我明白了,我的错。我忽略了你正在使用DDLDatabase

标签: jooq


【解决方案1】:

这是一个已知问题,源于幕后DDLDatabase 使用 H2 内存数据库来模拟运行您的 SQL 脚本,然后对该 H2 数据库进行逆向工程。默认情况下,在 H2(和其他一些数据库)中,所有内容都在 PUBLIC 模式中。问题在这里:#7650

jOOQ 3.11 解决方法

目前(从 jOOQ 3.11 开始),我建议您在 DDL 脚本中明确指定架构,或者使用inputSchema = "PUBLIC",了解以上内容。

jOOQ 3.12 解决方案

在 jOOQ 3.12 中,此问题已通过 #7759 修复。可以指定非限定模式对象的行为:

<!-- The default schema for unqualified objects:
     - public: all unqualified objects are located in the PUBLIC (upper case) schema
     - none: all unqualified objects are located in the default schema (default) 

     This configuration can be overridden with the schema mapping feature -->
<property>
  <key>unqualifiedSchema</key>
  <value>none</value>
</property>

【讨论】:

  • 感谢您的回答,我再次尝试使用inputSchema = "PUBLIC" 并解决了问题。还没有尝试过 Jooq 3.12 解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 2016-02-25
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多