postgresql的jdbc驱动程序的"ResultSet.getMetaData.getTableName(col)"总是返回一个空字符串是否正确?

Fre*_*ind 7 postgresql metadata jdbc tablename

当我使用postgresql时,我发现以下代码:

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from t");

String tableName = rs.getMetaData().getTableName(1);
System.out.println(tableName);
Run Code Online (Sandbox Code Playgroud)

它打印一个空字符串.

所以我检查了源代码,发现该方法org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData#getTableName总是返回一个空字符串.

源代码是:

public abstract class AbstractJdbc2ResultSetMetaData implements PGResultSetMetaData {

    /*
     * @param column the first column is 1, the second is 2...
     * @return column name, or "" if not applicable
     * @exception SQLException if a database access error occurs
     */
    public String getTableName(int column) throws SQLException
    {
        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以看到它只是返回一个"".

我找到了关于此的讨论,请参阅:http://archives.postgresql.org/pgsql-jdbc/2009-12/msg00100.php

他们认为"rs.getMetaData.getTableName(col)"应该返回查询中的别名而不是基础表名.但这很难实现,所以最好把它留空.

他们还提供了获取表名的方法,使用:

PGResultSetMetaData.getBaseTableName() 
Run Code Online (Sandbox Code Playgroud)

样品:

ResultSet rs = stmt.executeQuery("select * from x");
// convert it to PGResultSetMetaData 
PGResultSetMetaData meta = (PGResultSetMetaData)rs.getMetaData(); 
String tableName = meta.getBaseTableName(1);
Run Code Online (Sandbox Code Playgroud)

现在它可以打印正确的表名.

我不知道postgresql的实现是否正确,但返回基础表名比空字符串更有用,并且,大多数其他数据库提供基础表名而不是空字符串.

我使用play2的anorm框架与postgesql有问题:Play2的anorm无法在postgresql上运行,但在其他数据库上运行良好.

您认为postgresql的jdbc驱动程序的正确实现是什么?返回一个空字符串,基础表名称或其他什么?

Mat*_*att 3

我想说,返回空字符串显然是接口的不正确实现,因为表名永远不能被视为空字符串。

\n\n

我认为他们正在努力解决的问题是,虽然他们当前的实现是错误的,但一旦他们选择了一个实现,他们就会坚持下去,直到他们决定打破对行为的依赖是可以接受的。因此,他们选择添加一个名称明确的方法,并提供大多数用户期望来自的数据getTableName,并留下该方法明显损坏的实现getTableName,直到就它应该返回的内容达成共识或提交补丁为止从而落实共识。

\n\n

我的直觉反应是该方法getTableName应该返回用于该表的别名。表可以与其自身连接,并且使用别名可以让您识别正在引用哪个表。查询中可能已生成表(例如取消数组的嵌套),因此数据库中甚至没有表名。如果您始终做出决定 \xe2\x80\x9c,getTableName返回别名 \xe2\x80\x9d,那么至少用户知道会发生什么;否则,您最终会发现该方法应该返回什么并不明显。

\n\n

然而,即使我假设我的直觉反应是\xe2\x80\x9c正确的实现\xe2\x80\x9d,它也会引发兼容性问题。如果 PostgreSQL\xe2\x80\x99 的目标之一是普及,那么最好能够以尽可能少的投资从另一个 DBMS 切换到 PostgreSQL。因此,像 \xe2\x80\x9chow 其他 JDBC 实现 java.sql 接口吗?\xe2\x80\x9d 这样的事情就变得相关了。正如您所说,存在一个框架,它对如何ResultSetMetaData实现有期望,并且它可能不是唯一对如何java.sql实现接口有一定期望的框架。

\n\n

无论他们最终选择哪种实现都将是一个权衡,所以我可以理解为什么 \xe2\x80\x9ckick the can down the road\xe2\x80\x9d 是他们的选择。一旦他们选择了想要做出的权衡,他们就被锁定了。

\n\n

编辑:我建议抛出有关未实现的异常比只是默默地失败要好。我希望依赖特定实现的框架getTableName无论如何都不会使用空字符串,并且错误或本身会默默地失败。

\n