簡體   English   中英

有沒有辦法在jooq中進行反向“代碼生成”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM