【问题标题】:Is there a way to do a reverse "code generation" in jooq?有没有办法在 jooq 中进行反向“代码生成”?
【发布时间】:2017-04-26 22:56:03
【问题描述】:

我在我的一个项目中使用了 jooq(版本 3.5.3),我对此非常满意。现在我遇到的情况是,最好检查数据库中的表是否可用,如果不是,请创建它。

当我在新系统上安装我的软件时,这会派上用场,我可以自动处理表创建。

我最初的想法是使用:

DSLContext create = DSL.using(conn, SQLDialect.POSTGRES);
for (Table<?> t : Public.PUBLIC.getTables()) {
    create.createTable(t);
}

但是,由于缺少.execute(),它什么也不做。但这显然只有在至少添加一个.column() 时才有可能。如果我这样做了

create.createTable(t).column("foo", SQLDataType.INTEGER).execute();

它可以工作,并创建表,但(自然)只有一个名为 foo 的列。

所以,问题是: 有没有一种懒惰的方法来在数据库中创建适合生成代码的表,还是我必须为此使用更手动的方法?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    jOOQ 最初支持 DDL 语句的主要原因和动机正是您的想法,并在此功能请求中进行了描述:

    其实动机略有不同。虽然 jOOQ 不鼓励您将其 DDL 用于实际模式创建(因为缺乏对存储子句和其他供应商特定功能的支持),但它对于生成与原始生产有点等价的测试模式仍然很有用架构。

    从 jOOQ 3.6 开始,支持的 DDL 语句仍远未完成,无法帮助您重新生成架构,这就是为什么 #3160 仍未实现的原因。您将不得不自己编写一些胶水代码,例如(仍然不完整,但给你一个想法):

    for (Table<?> t : Public.PUBLIC.getTables()) {
        CreateTableAsStep<?> a = create.createTable(t);
        CreateTableColumnStep b = null;
    
        for (Field<?> f : t.fields())
            if (b == null)
                b = a.column(f, f.getDataType());
            else
                b = b.column(f, f.getDataType());
    
        b.execute();
    }
    

    【讨论】:

    • 非常感谢。继续努力,这真的很有帮助!
    • @MCMLXXXII 感谢您的反馈!
    猜你喜欢
    • 2023-02-04
    • 2010-09-07
    • 2021-04-13
    • 2021-12-16
    • 2021-09-26
    • 2016-02-13
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多