java - 有没有办法在jooq中进行反向 "code generation"?

标签 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 的列。

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

最佳答案

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();
}

关于java - 有没有办法在jooq中进行反向 "code generation"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29822130/

相关文章:

sql - mysql 表连接选择

java - Tomcat 上下文资源不会加载 h2 驱动程序

java - 在哪里放置 Maven 参数化 junit 输入 xml 文件

java - 附有按钮点击的事件

php - GROUP BY 不起作用

mysql - 寻找大表查询的优化

java - jOOq 键产生错误查询

java - JOOQ动态条件查询

Java - 传递 "this"时在对象属性中获取空值

java - 如何在java中从ANTLR AST获取所有变量