有没有办法在 jooq 中做一个反向 "code generation"?
Is there a way to do a reverse "code generation" in jooq?
我在我的一个项目中使用了 jooq(版本 3.5.3),我对它非常满意。现在我遇到这样的情况,最好检查数据库中的 table 是否可用,如果不是,则创建它。
当我在新系统上安装我的软件时,这会派上用场,我可以自动处理 table 创建。
我最初的想法是使用:
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();
它有效,并创建了 table,但(自然地)只有一个名为 foo 的列。
所以,问题是:有没有一种懒惰的方法可以在数据库中创建适合生成代码的 table,或者我有要为此使用更手动的方法吗?
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();
}
我在我的一个项目中使用了 jooq(版本 3.5.3),我对它非常满意。现在我遇到这样的情况,最好检查数据库中的 table 是否可用,如果不是,则创建它。
当我在新系统上安装我的软件时,这会派上用场,我可以自动处理 table 创建。
我最初的想法是使用:
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();
它有效,并创建了 table,但(自然地)只有一个名为 foo 的列。
所以,问题是:有没有一种懒惰的方法可以在数据库中创建适合生成代码的 table,或者我有要为此使用更手动的方法吗?
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();
}