如果两个模式相同,可以使用jooq进行比较吗?

时间:2017-04-26 10:08:05

标签: java sql jooq

如果两个模式相同,可以使用jooq进行比较吗?不是数据,而是表,约束,权限等是相同的?

1 个答案:

答案 0 :(得分:1)

您可以比较jOOQ API中表示的所有内容,包括:

  • 目录(仅限SQL Server)
  • 架构
  • 列及其类型
  • 用户定义的类型
  • 序列
  • 标识
  • 约束(包括主键,唯一键,外键和检查约束)

不支持的内容(但在jOOQ 3.9中)

示例算法

...比较H2 PUBLIC架构的两个版本:

assertEquals(v1.Public.PUBLIC, v2.Public.PUBLIC);

List<Table<?>> tables1 = v1.Public.PUBLIC.getTables();
List<Table<?>> tables2 = v2.Public.PUBLIC.getTables();
assertEquals(tables1, tables2);

for (int i = 0; i < tables1.size(); i++) {
    Table<?> table1 = tables1.get(i);
    Table<?> table2 = tables2.get(i);

    assertArrayEquals(format("Fields differ for %s and %s", table1, table2),
        table1.fields(), table2.fields());
    assertEquals(format("Primary keys differ for %s and %s", table1, table2),
        table1.getPrimaryKey(), table2.getPrimaryKey());
    assertEquals(format("Schemas differ for %s and %s", table1, table2),
        table1.getSchema(), table2.getSchema());
    assertEquals(format("Identities differ for %s and %s", table1, table2),
        table1.getIdentity(), table2.getIdentity());
    assertEquals(format("Keys differ for %s and %s", table1, table2),
        table1.getKeys(), table2.getKeys());
    assertEquals(format("References differ for %s and %s", table1, table2),
        table1.getReferences(), table2.getReferences());
}

如果要比较相同内容的两个不同模式

它会变得有点棘手,因为jOOQ QueryPart.equals()实现通常基于:

  • toString()比较
  • 合格名称比较

由于两个不同的模式具有不同的限定名称,因此您必须调整上述算法并比较每个对象的getName()结果,而不是整个对象。

比较XML内容

也许这对你来说更容易...... jOOQ 3.9使用DSLContext.informationSchema()引入了#5460方法。这些方法返回带有JAXB注释的类,这些类可以编组为XML字符串:

StringWriter writer = new StringWriter();
JAXB.marshal(ctx.informationSchema(mySchema), writer);
System.out.println(writer.toString());

您可以将这两个版本与任何XML工具进行比较,例如:使用XSLT

如果您只想手动比较

如果你有两个版本的生成代码,你可以简单地在两个目录之间创建一个差异,或者使用你的VCS向你显示差异;-)也许这样就足够了。