4

我正在手动定义数据库 XML 模式以使用 Jooq 功能从定义中生成相应的代码。我正在使用 Gradle 通过 Jooq 生成代码:

jooq {
    version = '3.13.5'
    edition = nu.studer.gradle.jooq.JooqEdition.OSS
    configurations {
        crate {  
            generationTool {
                logging = org.jooq.meta.jaxb.Logging.INFO
                generator {
                    database {
                        name = 'org.jooq.meta.xml.XMLDatabase'
                        properties {
                            property {
                                key = 'dialect'
                                value = 'POSTGRES'
                            }
                            property {
                                key = 'xmlFile'
                                value = 'src/main/resources/crate_information_schema.xml'
                            }
                        }
                    }
                    target {
                        packageName = 'it.fox.crate'
                        directory = 'src/generated/crate'
                    }
                    strategy.name = "it.fox.generator.CrateGenerationStrategy"
                }
            }
        }
    }
}

crate_information_schema.xml这是我引用的 XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<information_schema xmlns="http://www.jooq.org/xsd/jooq-meta-3.14.0.xsd">
    <schemata>
        <schema>
            <catalog_name></catalog_name>
            <schema_name>doc</schema_name>
            <comment></comment>
        </schema>
    </schemata>
    <tables>
        <table>
            <table_catalog></table_catalog>
            <table_schema>doc</table_schema>
            <table_name>events</table_name>
            <table_type>BASE TABLE</table_type>
            <comment></comment>
        </table>
    </tables>
    <columns>
        <column>
            <table_catalog></table_catalog>
            <table_schema>doc</table_schema>
            <table_name>events</table_name>
            <column_name>data_block['angularPositionArray']</column_name>
            <data_type>real_array</data_type>
            <character_maximum_length>0</character_maximum_length>
            <numeric_precision>19</numeric_precision>
            <numeric_scale>0</numeric_scale>
            <ordinal_position>1</ordinal_position>
            <is_nullable>false</is_nullable>
            <comment>angularPositionArray</comment>
        </column>
        <column>
            <table_catalog></table_catalog>
            <table_schema>doc</table_schema>
            <table_name>events</table_name>
            <column_name>data_block['eventId']</column_name>
            <data_type>bigint(20)</data_type>
            <character_maximum_length>0</character_maximum_length>
            <numeric_precision>19</numeric_precision>
            <numeric_scale>0</numeric_scale>
            <ordinal_position>1</ordinal_position>
            <is_nullable>false</is_nullable>
            <comment>eventId</comment>
        </column>
    </columns>
</information_schema>

生成的代码不好,因为它表明使用的数据类型未知:

 /**
     * @deprecated Unknown data type. Please define an explicit {@link org.jooq.Binding} to specify how this type should be handled. Deprecation can be turned off using {@literal <deprecationOnUnknownTypes/>} in your code generator configuration.
     */
    @java.lang.Deprecated
    public final TableField<EventsRecord, Object> angularPositionArray = createField(DSL.name("data_block['angularPositionArray']"), org.jooq.impl.DefaultDataType.getDefaultDataType("\"real_array\"").nullable(false), this, "angularPositionArray");

我有一些问题:

  • Real Array 的正确数据类型是什么?
  • XML 中使用的键支持的数据类型列表在哪里?

NB CrateDB 是一个不受支持的数据库,但 Jooq 可以使用 Postgres 驱动程序与数据库通信,唯一的问题是手动创建模式。

4

1 回答 1

1

Real Array 的正确数据类型是什么?

使用<data_type>REAL ARRAY</data_type>(带有空格和大写字母,请参阅评论和问题#12611

XML 中使用的键支持的数据类型列表在哪里?

它与任何其他代码生成数据源相同:SQLDataType支持所有类型。围绕数组类型的约定目前没有记录,但任何 HSQLDB 或 PostgreSQL 的符号都应该有效。通过标准 SQL 正式支持数组类型作为用户定义类型的功能请求在INFORMATION_SCHEMA.ELEMENT_TYPES这里:https ://github.com/jOOQ/jOOQ/issues/8090

NB CrateDB 是一个不受支持的数据库,但 Jooq 可以使用 Postgres 驱动程序与数据库通信,唯一的问题是手动创建模式。

你显然可以使用XMLDatabase这个。我猜你不能使用JDBCDatabase,因为INFORMATION_SCHEMA太不同了,而且PG_CATALOG模式不存在?org.jooq.meta.Database但是,如果这更有意义,您也可以轻松实现自己的.

于 2021-11-08T07:38:34.930 回答