繁体   English   中英

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

[英]Is it correct that “ResultSet.getMetaData.getTableName(col)” of postgresql's jdbc driver is always returning an empty string?

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

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

String tableName = rs.getMetaData().getTableName(1);
System.out.println(tableName);

它打印一个空字符串。

所以我检查了源代码,发现方法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 "";
    }
}

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

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

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

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

PGResultSetMetaData.getBaseTableName() 

样品:

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

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

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

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

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

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

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

我的直觉反应是方法getTableName应该返回用于该表的别名。 表可以与自身连接,使用别名可以识别正在引用的表。 可能在查询中生成了一个表(例如,取消了数组),因此在数据库中甚至没有表名。 如果你做出“绝对永远的决定, getTableName返回别名”,那么至少用户知道会发生什么; 否则,你最终会明白该方法应该返回什么。

但是,即使我认为我的直觉反应是“正确的实现”,它也会引发兼容性问题。 如果PostgreSQL的一个目标是越来越受欢迎,那么可以用尽可能少的投资从另一个DBMS切换到PostgreSQL。 因此,诸如“其他JDBC如何实现java.sql接口?”之类的东西变得相关。 正如您所说,存在一个框架,它期望如何实现ResultSetMetaData ,并且它可能不是唯一一个对如何实现java.sql接口有一定期望的框架。

无论他们最终选择哪种实施方式都将是一种权衡,所以我可以看出为什么“在未来的路上踢”是他们的选择。 一旦他们选择了他们想要的权衡,他们就会被锁定。

编辑:我建议抛出一个未实现的例外将比默默地失败更好。 我希望依赖于getTableName的特定实现的框架无论如何都不会对空字符串有太多用处,并且错误或者它们自己都会无声地失败。

似乎这将在下一版本中更改: https//github.com/pgjdbc/pgjdbc/pull/107

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM