【问题标题】:Runtime validation of jOOQ generated classes and actual DB schemajOOQ 生成的类和实际 DB 模式的运行时验证
【发布时间】:2016-10-07 07:42:40
【问题描述】:

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

  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 字段中没有它们并且具有 @987654330 @ 代替。

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

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

【问题讨论】:

    标签: java postgresql jooq


    【解决方案1】:

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

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

    另一种解决方法(更多是 hack)是将生成的 Java 代码与文件系统级别的新重新生成(如 git diff)进行比较。我不确定这种方法是否对你有用。

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多