可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13

SQL解释器

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

从jOOQ 3.13开始,实现了一个SQL解释器,它可以解释SQL语言的一个子集(主要是DDL语句),并维护数据库元模型的最新内存表示。

该解释器通过各种 DSLContext.meta() 方法提供,例如可以如下使用

// Using the parser
Meta meta1 = create.meta(
  "create table t (i int)",
  "alter table t add primary key (i)",
  "create table u (i int references t)"
);

Meta meta2 = create.meta(
  createTable("t").column("i", INTEGER),
  alterTable("t").add(primaryKey("i")),
  createTable("u").column("i", INTEGER).constraint(foreignKey("i").references("t"))
);

解释是增量的。在任何预先存在的 org.jooq.Meta 模型上,可以调用 apply() 来派生模型的新版本。这包括能够组合不同的模型源,包括基于JDBC java.sql.DatabaseMetaData 的模型。

// Get live access to your current Connection's DatabaseMetaData
Meta meta1 = create.meta();

// Create a new model representation with an interpreted, additional table
// The query is not executed! The DDL is only interpreted in jOOQ, and a derived meta model is created from it
Meta meta2 = meta1.apply("create table t (i int)");

// Create another new model representation, with a table removed
// Again, none of these queries are executed.
Meta meta3 = meta2.apply("drop table u cascade");

最后,如果你想将元模型导出为不同的支持格式之一,你可以使用

// The JAXB annotated XML version of your "information schema":
InformationSchema is = meta.informationSchema();

// A set of DDL queries that can be used to reproduce your schema on any database and dialect:
Queries queries = meta.ddl();

可以使用不同的元模型源,包括jOOQ API构建的DDL语句,或者一组将使用SQL解析器动态解析的SQL字符串。这些来源可以是数据库变更管理脚本,例如Flyway或jOOQ管理的脚本。

结果类型是运行时 org.jooq.Meta 模型,它可以访问普通的jOOQ API,包括目录和模式。然后,这些对象可以与任何其他jOOQ API一起使用,例如,计算数据库中所有表中的所有行

for (Table<?> table : meta.getTables())
  System.out.println(table + " has " + create.fetchCount(table) + " rows");

有关解释器配置标志集,请参阅关于解释器设置的部分

反馈

您对此页面有任何反馈吗?我们很乐意听到您的意见!

The jOOQ Logo