jOOQ生成的类和实际DB模式的运行时验证

时间:2016-06-07 11:59:05

标签: java postgresql jooq

我需要检查应用程序启动时当前在DB和架构中的DB架构是否与先前JOOQ生成的模型相同。 我尝试使用建议的解决方案here并发现了一些问题:

  1. 查询所有表的技巧:此解决方案不检查列类型,只检查表和字段名称,但我也需要检查类型。
  2. MY_SCHEMA.getTables().equals(create.meta().getTables()):此处仅检查架构和名称,而不是列类型。
  3. 我尝试使用create.meta().getTables()中提供的信息并手动进行比较,但遇到了另一个问题。在某些情况下,运行时从create.meta()检索的生成字段和字段的数据类型不匹配。

    示例是"time" timestamp without time zone DEFAULT now()字段,其中lengthprecisionscale值并且在运行时JOOQ字段中没有defaultValue值,但没有将它们放在生成的JOOQ字段中并改为defaultValue

    JOOQ的行为是否正确?使用create.meta()提取的元数据和生成的模式中的元数据不能用于比较。有没有其他方法可以正确地做到这一点?

    使用测试:
    带有JDBC 9.4.1208驱动程序的PostgreSQL 9.5.3,
    JOOQ 3.8.2,
    Java 8

1 个答案:

答案 0 :(得分:0)

确实,(不幸的是)生成的代码(更完整)与org.jooq.Meta提供的内容(不太完整)之间存在细微差别,因为后者内部依赖于JDBC {{1} },它并不总是正确/完全实现。

解决问题的一种方法是将生成的代码与jOOQ-meta的输出进行比较,jOOQ-meta是jOOQ代码生成器使用的库。这将是更多的手动编码工作,但从jOOQ 3.8开始,它与用例一样好。

另一种解决方法(更多的是黑客攻击)是将生成的Java代码与文件系统级别(如git diff)上的重新生成进行比较。我不确定这种方法是否适合你。