有没有办法做反向"代码生成"在jooq?

时间:2015-04-23 11:29:44

标签: java sql jooq

我在我的一个项目中使用了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的列。

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

1 个答案:

答案 0 :(得分: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();
}