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 的正确数据类型是什么?
使用<data_type>REAL ARRAY</data_type>
(带有空格和大写字母,请参阅 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
。
【讨论】:
谢谢,我已经尝试过<data_type>real array</data_type>
,但我仍然有:` @Deprecated public final TableField<data_type>REAL ARRAY</data_type>
。它看起来不像是同一个问题,但谁知道呢。也许,在这里报告一个完全独立的复制器的错误? github.com/jOOQ/jOOQ/issues/new/choose。这里有一个创建此类复制器的模板:github.com/jOOQ/jOOQ-mcve
仍然没有成功。我创建了一个带有phone_numbers real[]
列的真实Postgres DB,并使用org.jooq.codegen.XMLGenerator
来反转XML。 xml 生成器生成 <data_type>ARRAY</data_type>
列规范而不是 REAL ARRAY
列规范。与 ARRAY 相反,创建 Object[]
和 REAL ARRAY
不起作用。我使用的是 3.15.4 版本。我需要等下一个吗?
请报告一个带有详细信息的错误以重现。我没有你问题的全貌。请记住,正式支持此 XML 格式的数组类型的问题尚未实现:github.com/jOOQ/jOOQ/issues/8090,并且您使用的是不受支持的方言,这意味着在这种极端情况下(例如数组类型),方言可能会妨碍,因为 XML 格式也试图模仿由 eg 产生的输出PostgresDatabase
或 H2Database
让代码生成器的其余部分正常工作。
CrateDB 的信息模式应该是相似的,虽然不完全相同。此外,我们确实在 CrateDB 中实现了大部分 PG_CATALOG 模式。我也很乐意协助让 CrateDB 完全兼容 :)以上是关于Jooq XML 数据库生成的主要内容,如果未能解决你的问题,请参考以下文章
jOOQ 不生成将 <daos> 标志设置为 true 的 DAO