当前位置: 首页 > 知识库问答 >
问题:

使用jOOQ作为模式生成器(输出为纯sql)

席烨
2023-03-14

我尝试使用jOOQ作为模式生成器来生成DDL语句,然后再生成SQL insert语句。

底层数据来自静态CSV文件,我基本上希望编写一个静态SQL脚本,其中包括创建模式和插入数据的语句;只是一个转储文件。

例如,我有一个包含表definition的Groovy类:


class ContinentTable extends CustomTable<Record> {

    static ContinentTable CONTINENT = new ContinentTable()

    static UniqueKey<Record> CONTINENT_PK = createUniqueKey(CONTINENT, name("continent_pk"), [CONTINENT.ID] as TableField[], true)

    TableField<Record, String> ID = createField(name("id"), VARCHAR(255).nullable(false))
    TableField<Record, String> CODE = createField(name("code"), VARCHAR(2).nullable(false))
    TableField<Record, String> NAME = createField(name("name"), VARCHAR(255).nullable(false))
    TableField<Record, String> DEMONYM = createField(name("demonym"), VARCHAR(255).nullable(false))

    private ContinentTable() {
        super(name("continent"))
    }

    @Override
    Class<? extends Record> getRecordType() {
        return Record
    }

    @Override
    UniqueKey<Record> getPrimaryKey() {
        return CONTINENT_PK
    }
}
dsl.createTable(ContinentTable.CONTINENT)

create table "continent";
dsl.createTable(ContinentTable.CONTINENT).columns(ContinentTable.CONTINENT.fields())

如果我想添加主键和可能的外键、索引等,它会变得更加复杂。

在调用DSL.CreateTable(continentTable.continent)时没有添加这些内容,这是预期的行为吗?

注意:我手动创建ContinentTable,因为我没有源数据库,所以没有使用codegen。

共有1个答案

翟沈义
2023-03-14

我使用的是Jooq的dsl.createtable(continenttable.continent).columns(continenttable.continent.fields())

但是jOOQ还有一个DDL方法,它完全符合我的要求。

def queries = create.ddl(ContinentTable.CONTINENT)
queries.each { query ->
    println query}
}

它生成包含列、约束等的表。

 类似资料:
  • 有时,当函数具有这样的签名时,它可能会变得毛茸茸的: 对于编译器来说,所有UUID都是相同的,因此希望在运行时被数据库捕获。 我喜欢jOOQ在编译时捕获许多问题的方式,我也想解决这个问题。我的目标是让每个表的每个键都有自己的类,并让这些字段正确生成pojos。 实现这一目标的最佳方法是什么?我想出了以下几点: 全面的JavaGenerator实现 具有大量强制类型映射的转换器,以及手动创建的键类

  • 有没有从纯Java代码生成jOOQ类的方法?如果不是,最接近的替代方案是什么?理想情况下,我希望在渐变版本中进行此操作。 我找到了这个答案,它链接到了这篇博文。这篇文章的实质是: 从JPA车型开始 将其转换为DDL脚本(.sql文件,其中包含语句) 创建一个新的HSQLDB文件,并通过在其上运行DDL脚本用表填充它。将生成的数据库保存到磁盘 从磁盘加载该数据库并在其上运行jOOQ代码生成 使用生成

  • 我试图自动生成刀的视图。我已经预先设置了配置: whitch为表生成dao,但不为视图生成dao。根据文件规定: 如果您使用的是jOOQ的代码生成器,那么可以将其配置为为为您生成POJO和DAO。然后,jOOQ为每个UpdateRecord生成一个DAO,即为每个表生成一个单列主键。 和 公共接口 它表示来自表或视图的记录-表记录其基础表或视图具有“主唯一键”,即主键或至少一个唯一键jOOQ使用“

  • MySQL不接受此处生成的datetime值。我探索并发现jOOQ转换器可以用于自定义转换。我可以找到如何在获取数据时使用转换的示例,但无法弄清楚如何在查询时使用转换器。如何使用jOOQ转换器生成SQL而不生成代码?或者是否有更好的方法为SQL生成此查询。

  • 我正在使用Laravel4.2SchemaBuilder创建一些相互引用的表,但遇到了一些问题。 我有一个简化的ERD。请注意,仅显示相关列: 请注意,我无法以任何方式修改和表,因为我正在开发一个模块以连接到现有系统。 我正在努力实现以下目标: 表包含有关表中的行的额外信息 目前,我使用以下代码创建两个表: 表的创建脚本将导致以下SQL查询: 这反过来会导致以下错误: SQLSTATE[42000

  • 正如标题所说。雅加达注释不在我的类路径中,所以我不知道为什么jooq用这些注释生成java类。我希望能够告诉它不要使用它,或者更确切地说有一种方法来指定它使用哪些验证注释。 我唯一设置为true的属性是,然后到处都有雅加达注释。你知道如何配置它来使用javax之类的东西吗? 我使用的是jooq codegen 3.16.4