Jooq XML 数据库生成

Posted

技术标签:

【中文标题】Jooq XML 数据库生成【英文标题】:Jooq XML Database generation 【发布时间】:2021-12-20 14:55:23 【问题描述】:

我正在手动定义数据库 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"
                
            
        
    

这是我引用的 XML 文件 crate_information_schema.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 中使用的键在哪里?

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

【问题讨论】:

【参考方案1】:

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

使用&lt;data_type&gt;REAL ARRAY&lt;/data_type&gt;(带有空格和大写字母,请参阅 cmets 并发出 #12611)

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

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

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

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

【讨论】:

谢谢,我已经尝试过&lt;data_type&gt;real array&lt;/data_type&gt;,但我仍然有:` @Deprecated public final TableField DATA_BLOCK_5b_27ANGULARPOSITIONARRAY_27_5d = createField(DSL.name("data_block['angularPositionArray']"), org.jooq.impl.DefaultDataType.getDefaultDataType("\"真实数组\"").nullable(false), this, "angularPositionArray"); ` and: ` 20:25:30 INFO 读取自:src/main/resources/crate_information_schema.xml [*] 20:25:30 INFO ARRAYs fetched : 0 (0 include, 0 excludes) `你知道为什么吗?问候 在调查时,我发现了一个与区分大小写有关的错误:github.com/jOOQ/jOOQ/issues/12611。它适用于&lt;data_type&gt;REAL ARRAY&lt;/data_type&gt;。它看起来不像是同一个问题,但谁知道呢。也许,在这里报告一个完全独立的复制器的错误? github.com/jOOQ/jOOQ/issues/new/choose。这里有一个创建此类复制器的模板:github.com/jOOQ/jOOQ-mcve 仍然没有成功。我创建了一个带有phone_numbers real[] 列的真实Postgres DB,并使用org.jooq.codegen.XMLGenerator 来反转XML。 xml 生成器生成 &lt;data_type&gt;ARRAY&lt;/data_type&gt; 列规范而不是 REAL ARRAY 列规范。与 ARRAY 相反,创建 Object[]REAL ARRAY 不起作用。我使用的是 3.15.4 版本。我需要等下一个吗? 请报告一个带有详细信息的错误以重现。我没有你问题的全貌。请记住,正式支持此 XML 格式的数组类型的问题尚未实现:github.com/jOOQ/jOOQ/issues/8090,并且您使用的是不受支持的方言,这意味着在这种极端情况下(例如数组类型),方言可能会妨碍,因为 XML 格式也试图模仿由 eg 产生的输出PostgresDatabaseH2Database 让代码生成器的其余部分正常工作。 CrateDB 的信息模式应该是相似的,虽然不完全相同。此外,我们确实在 CrateDB 中实现了大部分 PG_CATALOG 模式。我也很乐意协助让 CrateDB 完全兼容 :)

以上是关于Jooq XML 数据库生成的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ 不生成将 <daos> 标志设置为 true 的 DAO

调试“jOOQ代码生成工具配置错误”

使用 DDL 数据库生成代码时找不到函数 - jooq

使用 JOOQ 从 MS SQL 数据库生成代码时遇到问题

JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型

JOOQ 使用 Maven 代码生成设置 Oracle