列出不需要用模式名称限定的数据库表
Posted
技术标签:
【中文标题】列出不需要用模式名称限定的数据库表【英文标题】: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
中指定的架构
【参考方案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 中没有没有模式的表。所以传递""
永远不会返回任何东西。以上是关于列出不需要用模式名称限定的数据库表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google BigQuery 中列出与特定名称匹配的表?
无法使用视图定义中具有表的完全限定名称的视图编译 SSDT 数据库项目
从三个表中提取数据;试图列出员工正在从事的项目的项目编号、项目名称和工作时间