【问题标题】:list database tables that don't need to be qualified with schema name列出不需要用模式名称限定的数据库表
【发布时间】:2021-12-28 16:36:45
【问题描述】:

我使用:jdbc:postgresql://127.0.0.1/mydb?currentSchema=app96 连接到 PostgreSQL 服务器。 我需要列出存在的表并创建在我的服务器初始化期间丢失的表。

这是我的代码:

final ResultSet rs2 =
    conn.getMetaData().getTables(null, "", null, new String[] { "TABLE" });
while (rs2.next()) {
    System.out
        .println(rs2.getString("TABLE_SCHEM") + "." + rs2.getString("TABLE_NAME"));
}

打印出来:

app96.t1
app96.t2
public.administration$account
public.appmodule$uploadedfile
public.audittrail$audittrailsuperclass
...

来自getTables的javadoc:

schemaPattern ... "" 检索那些没有架构的

但似乎getTables 对待空字符串的方式与 null 相同。是否有纯 JDBC 方法来按当前模式进行过滤,还是我必须自己实现特定于 DB 的过滤器?

【问题讨论】:

  • 在 Postgres 中没有没有模式的表这样的东西。是否需要完全限定查询中的表引用取决于 search_path 中指定的架构

标签: java postgresql jdbc database-metadata


【解决方案1】:

是的,按照 Java 中的 JDBC 规范,这是正确的。

schemaPattern - 模式名称模式;必须与架构名称匹配 它存储在数据库中; "" 检索那些没有模式的; null 表示不应使用模式名称来缩小范围 搜索

但 PostgreSQL 实现 PgDatabaseMetaData 似乎没有兑现这一点。

getTables 方法具有以下检查,其中检查 NULL 以及非空字符串。 (可能这就是 PostgreSQL 的实现方式)

  if (schemaPattern != null && !schemaPattern.isEmpty()) {
      select += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
    }

PgDatabaseMetaData implementation code from Github

【讨论】:

  • 这是正确的,因为在 Postgres 中没有没有模式的表。所以传递"" 永远不会返回任何东西。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 2022-08-04
  • 2015-09-13
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2011-08-06
相关资源
最近更新 更多