2015-04-23 51 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感謝您的好評! –

相關問題