我在我的一个项目中使用了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的列。
所以,问题是:是否有一种懒惰的方法只是在数据库中创建适合生成代码的表,或者我是否必须使用更手动的方法?
答案 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();
}