Переименование столбцов в операторе выбора MySQL с помощью R-пакета RJDBC - PullRequest
9 голосов
/ 09 октября 2011

Я использую пакет RJDBC для подключения к базе данных MySQL (Maria DB) в R на компьютере с Windows 7, и я пытаюсь сделать заявление типа

select a as b
from table

но столбец всегда будет называться «а» во фрейме данных.

Это нормально работает с RODBC и RMySQL, но не работает с RJDBC. К сожалению, мне приходится использовать RJDBC, поскольку это единственный пакет, в котором нет проблем с кодировкой букв китайского, иврита и т. Д. (Заданные имена и т. Д. Не работают с RODBC и RMySQL).

Кто-нибудь сталкивался с этой проблемой?

Ответы [ 4 ]

9 голосов
/ 19 марта 2012

Я столкнулся с тем же разочаровывающим вопросом.Иногда ключевое слово AS будет иметь ожидаемый эффект, но в других случаях это не так.Мне не удалось определить условия, чтобы заставить его работать правильно.

Краткий ответ: (Спасибо Саймону Урбанеку (сопровождающему пакета для RJDBC), Еву и Себастьену! См. Длинный ответ. ) Одна вещь, которую вы можете попробовать, это открыть ваше соединение JDBC, используя ?useOldAliasMetadataBehavior=true в строке соединения.Пример:

drv <- JDBC("com.mysql.jdbc.Driver", "C:/JDBC/mysql-connector-java-5.1.18-bin.jar", identifier.quote="`")
conn <- dbConnect(drv, "jdbc:mysql://server/schema?useOldAliasMetadataBehavior=true", "username", "password")
query <- "SELECT `a` AS `b` FROM table"
result <- dbGetQuery(conn, query)
dbDisconnect(conn)

Это сработало для меня!Более подробную информацию, включая предупреждения, можно найти в Длинном ответе.

Длинном ответе: Я перепробовал все виды вещей, включая создание представлений, изменение запросов с использованием операторов JOIN, НЕ используя операторы JOIN, операторы ORDER BY, GROUP BY и т. Д. Я так и не смог выяснить, почему некоторые мои запросы могли переименовывать столбцы, а другие - нет.

Я связался с сопровождающим пакета(Саймон Урбанек.) Вот что он сказал:

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

Затем он порекомендовал мне убедиться, что у меня установлен самый последний драйвер JDBC для MySQL.У меня была самая последняя версия.Тем не менее, это заставило меня задуматься «возможно, это ошибка с драйвером JDBC».Итак, я искал в Google: mysql jdbc driver bug alias.

Лучший результат для этого запроса: запись на bugs.mysql.com .Yev, используя MySQL 5.1.22, говорит, что когда он обновил драйвер с версии 5.0.4 до 5.1.5, псевдонимы его столбцов перестали работать.На вопрос, была ли это ошибка.

Себастьен ответил: «Нет, это не ошибка! Это задокументированное изменение поведения во всех последующих версиях драйвера».и предложил использовать ?useOldAliasMetadataBehavior=true, сославшись на документацию для драйвера JDBC .

Caveat Lector: В документации для драйвера JDBC указано, что

useColumnNamesInFindColumn предпочтительнее, чем useOldAliasMetadataBehavior, если вам не требуется специфическое поведение, которое оно обеспечивает в отношении ResultSetMetadata.

У меня не было времени, чтобы полностью исследовать, что это значит.Другими словами, я не знаю, каковы все последствия использования useOldAliasMetadataBehavior=true.Используйте на свой риск.У кого-то еще есть информация?

0 голосов
/ 23 декабря 2015

Это обходной путь, который мы используем для R и SAP HANA через RJDBC:

names(result)[1]<-"b"

Это не самый лучший обходной путь, но, поскольку решение Aaron работает для нас,пошел с этим «решением».

0 голосов
/ 28 августа 2015

В интерфейсе ResultSetMetaData есть отдельная функция для извлечения столбца метка против столбца имя :

String getColumnLabel(int column) throws SQLException;

Получает предложенный заголовок указанного столбца для использования в распечатках и дисплеи. Предлагаемый заголовок обычно указывается в SQL AS пункт. Если SQL AS не указан, возвращаемое значение с getColumnLabel будет таким же, как и значение, возвращаемое getColumnName метод.

Использование getColumnLabel должно решить эту проблему (если нет, убедитесь, что ваш драйвер JDBC соответствует этой спецификации).

, например

ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while(rs.next()) {
    for (int i = 1; i < columnCount + 1; i++) {
        String label = rsmd.getColumnLabel(i);
        System.out.println(rs.getString(label));
    }   
}
0 голосов
/ 11 октября 2011

Я не знаю RJDBC, но в некоторых случаях, когда необходимо дать постоянные псевдонимы столбцам без их переименования, вы можете использовать VIEW

CREATE OR REPLACE VIEW v_table AS
SELECT a AS b
FROM table

... и затем ...

SELECT b FROM v_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...