2016-06-07 40 views
0

我需要檢查應用程序啓動時,當前在DB中使用的數據庫模式和用於以前JOOQ生成模型的模式是否相同。 我試圖用解決方案建議here,發現了一些問題:jOOQ生成的類和實際的數據庫模式的運行時驗證

  1. 特技查詢所有表:此解決方案不檢查列類型,只有表和字段的名字,但我需要檢查的類型了。
  2. MY_SCHEMA.getTables().equals(create.meta().getTables()):此處僅檢查模式和名稱,而不是再次檢查列類型。

我試圖使用create.meta().getTables()中的可用信息並手動進行比較,但遇到了另一個問題。從create.meta()運行時檢索的生成字段和字段的數據類型在某些情況下不匹配。

實施例是"time" timestamp without time zone DEFAULT now()字段具有lengthprecisionscale值,並且不具有在運行時JOOQ字段defaultValue值,但沒有它們產生JOOQ字段和具有defaultValue代替。

JOOQ的正確行爲?使用create.meta()提取的元數據和生成模式的元數據不能用於比較。有沒有其他方法可以正確執行此操作?

對於測試中使用:
的PostgreSQL 9.5.3用JDBC 1208年4月9日的驅動程序,
JOOQ 3.8.2,
爪哇8

回答

0

事實上,有(不幸)所生成的稍有差別代碼(更完整)以及由org.jooq.Meta(不完整)交付的內容,因爲後者在內部依賴於JDBC的DatabaseMetaData,而這並不總是正確/完全實現。

解決您的問題的一種方法是將生成的代碼與jOOQ-meta(由jOOQ代碼生成器使用的庫)的輸出進行比較。這將會是更多的手工編碼工作,但是這對於您的使用情況來說是非常好的,例如JOOQ 3.8。

另一個解決方法(更多的是黑客)將比較生成的Java代碼和文件系統級別的新一代重新生成(如git diff)。我不確定這種方法是否適合你。