Правильно ли, что ResultSet.getMetaData.getTableName(col) драйвера jdbc postgresql всегда возвращает пустую строку?

Когда я использую 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 с postgesql: анорм Play2 не может работать на postgresql, но это хорошо работает и с другими базами данных.

Как вы думаете, правильная реализация драйвера jdbc postgresql? Вернуть пустую строку, имя базовой таблицы или что-то еще?


person Freewind    schedule 12.02.2012    source источник


Ответы (2)


Я бы сказал, что возврат пустой строки — это, очевидно, неправильная реализация интерфейса, поскольку имя таблицы никогда не может считаться пустой строкой.

Проблема, с которой, как мне кажется, они борются, заключается в том, что, хотя их текущая реализация неверна, как только они выберут реализацию, они застрянут на ней, пока не решат, что нарушение зависимостей от поведения приемлемо. Поэтому они решили добавить метод с недвусмысленным названием и предоставить данные, которые большинство пользователей ожидали получить от getTableName, и оставить явно неработающую реализацию метода getTableName до тех пор, пока не будет достигнут консенсус относительно того, что он должен возвращать, или до исправления. представляется, что реализует консенсус.

Моя интуиция такова, что метод getTableName должен возвращать псевдоним, используемый для этой таблицы. Таблица может быть объединена сама с собой, и использование псевдонима позволит вам определить, на что ссылаются. Таблица могла быть сгенерирована в запросе (например, при удалении вложенности массива) и, следовательно, даже не иметь имени таблицы в базе данных. Если принять решение «абсолютно всегда getTableName возвращает псевдоним», то, по крайней мере, пользователи знают, чего ожидать; в противном случае вы получите неочевидное, что должен возвращать метод.

Однако, даже если я предполагаю, что моя интуиция — это «правильная реализация», возникает вопрос совместимости. Желательно, чтобы была возможность перехода с другой СУБД на PostgreSQL с минимальными вложениями, если одной из целей PostgreSQL является рост популярности. Поэтому такие вещи, как «как другие JDBC реализуют интерфейсы java.sql?» стать актуальным. Как вы сказали, существует фреймворк, в котором есть ожидания относительно того, как должен быть реализован ResultSetMetaData, и, вероятно, он не единственный с определенными ожиданиями в отношении того, как будут реализованы интерфейсы java.sql.

Какую бы реализацию они ни выбрали, это будет компромисс, поэтому я понимаю, почему их выбор — «выбросить банку». Как только они выбирают компромисс, на который хотят пойти, они замыкаются в себе.

РЕДАКТИРОВАТЬ: я бы предположил, что исключение исключения в отношении нереализованного было бы лучше, чем просто молчаливый сбой. Я ожидаю, что фреймворки, которые полагаются на конкретную реализацию getTableName, в любом случае не будут иметь особого смысла для пустой строки, и либо ошибка, либо они сами по себе молча терпят неудачу.

person Matt    schedule 07.01.2013

кажется, это будет изменено в следующей версии: https://github.com/pgjdbc/pgjdbc/pull/ 107

person cchantep    schedule 27.12.2013