java - 查询适当的数据库模式

标签 java schema h2 information-schema jooq

这是我的 earlier 的后续问题关于使用 jooq 在 java 中指定多个模式与 H2 交互的问题。

我的测试 H2 DB 目前有 2 个模式:PUBLIC 和 INFORMATION_SCHEMA。 PUBLIC 被 H2 指定为默认模式。当运行应从 INFORMATION_SCHEMA.TABLES 等提取信息的查询时,查询会失败并出现“表未知”SQL 错误。我只能通过执行 factory.use(INFORMATION_SCHEMA) 来执行此类查询。没有构建错误等,并且 Eclipse 可以正确自动完成,例如 TABLES.TABLE_NAME。

如果我不这样做,即使我为架构创建了正确的 Factory 对象,jooq 似乎也不会预先添加适当的架构,例如

InformationSchemaFactory info = new InformationSchemaFactory(conn);

我读到了mapping但对于我将使用哪种模式作为输入/输出有点困惑。

最佳答案

默认情况下,InformationSchemaFactory 假定提供的连接实际上连接到 INFORMATION_SCHEMA。这就是模式名称不在 SQL 中呈现的原因。示例:

// This query...
new InformationSchemaFactory(conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch();

// ... renders this SQL (with the asterisk expanded):
SELECT * FROM "TABLES";

上述行为应记录在您生成的 InformationSchemaFactory Javadoc 中。为了在 "TABLES" 前面添加 "INFORMATION_SCHEMA",您有多种选择。

  1. 改用常规工厂,它不与任何架构绑定(bind):

    // This query...
    new Factory(H2, conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch();
    
    // ... renders this SQL:
    SELECT * FROM "INFORMATION_SCHEMA"."TABLES";
    
  2. 使用另一个模式的工厂,例如生成的PublicFactory:

    // This query...
    new PublicFactory(conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch();
    
    // ... renders this SQL:
    SELECT * FROM "INFORMATION_SCHEMA"."TABLES";
    
  3. 使用Settings以及适当的架构映射以强制呈现架构名称。

第一个选项可能是最简单的。

这篇博文将让您深入了解如何将执行的查询记录到您的首选记录器输出:http://blog.jooq.org/2011/10/20/debug-logging-sql-with-jooq/

关于java - 查询适当的数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12070934/

相关文章:

java - 使用Hibernate时是否需要在H2数据库中运行 "analyze"

jdbc - 您可以在 H2 中创建多个目录吗?

java - 为什么 ScheduledExecutorService 没有按预期工作?

mysql - 帖子、评论和回复的数据库模式设计

java - 检查数组中的数字是否在 0-array.length -1 之间

database - 支持动态属性的架构

android - 在Android上使用XStream时如何注释order字段?

spring - 如何在Spring Boot中禁用H2的DATABASE_TO_UPPER,无需显式连接URL

java - 集群事件驱动的 Java 应用程序 - 我应该使用 Websockets 还是轮询?

Java KeyListener 断断续续