2015-04-23 77 views
1

我在我的一个项目中使用jooq(版本3.5.3),我对此很满意。现在我遇到了这样的情况:检查数据库中的表是否可用,如果不是这样,请创建它。有没有办法在jooq中做一个反向的“代码生成”?

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

我最初的想法是使用:

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

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

非常感谢。并保持良好的工作,这真的很有帮助! – MCMLXXXII

+0

@MCMLXXXII感谢您的好评! –

相关问题