[英]Is there a way to do a reverse “code generation” in 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.