2011-10-09 5 views
9

estoy usando el paquete RJDBC para conectarse a una base de datos MySQL (María DB) en I en una máquina Windows 7 y estoy tratando de una declaración comocolumnas cambio de nombre en una instrucción de selección MySQL con RJDBC paquete R

select a as b 
from table 

pero la columna siempre seguirá siendo llamada "a" en el marco de datos.

Esto funciona normalmente con RODBC y RMySQL, pero no funciona con RJDBC. Desafortunadamente, tengo que usar RJDBC ya que este es el único paquete que no tiene ningún problema con la codificación de letras chinas, hebreas y demás (los nombres de conjuntos y demás no parecen funcionar con RODBC y RMySQL).

¿Alguien ha tenido este problema?

+0

Acabo de probarlo y puedo confirmar el problema. Desafortunadamente no tengo una solución. – ROLO

+0

me parece un error. –

Respuesta

9

Me he encontrado con el mismo problema frustrante. A veces, la palabra clave AS tendría su efecto previsto, pero otras veces no lo haría. No pude identificar las condiciones para que funcione correctamente.

respuesta corta: (!. Gracias a Simon Urbanek (mantenedor del paquete de RJDBC), Yev, y Sebastien Ver el Respuesta larga) Una cosa que usted puede intentar es abrir su conexión JDBC utilizando ?useOldAliasMetadataBehavior=true en su Cadena de conexión. Ejemplo:

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) 

¡Esto terminó trabajando para mí! Vea más detalles, incluyendo advertencias, en el Respuesta larga.

Respuesta larga: he intentado todo tipo de cosas, incluyendo hacer vistas, el cambio de consultas, utilizando instrucciones JOIN, NO usando instrucciones JOIN, utilizando ORDER BY y GROUP BY declaraciones, etc. Nunca he sido capaz de averiguar por qué algunas de mis consultas fueron capaces de cambiar el nombre de las columnas y otras no.

Me puso el mantenedor del paquete Esto es lo que dijo (Simon Urbanek.):

En la gran mayoría de los casos esto es un problema en el controlador JDBC, porque no hay realmente mucho RJDBC puede hacer aparte de llamar al conductor.

Luego me recomendó que me asegurara de tener el controlador JDBC más reciente para MySQL. Yo tenía la versión más reciente. Sin embargo, me hizo pensar "tal vez es un error con el controlador JDBC". Entonces, busqué en Google por: mysql jdbc driver bug alias.

El resultado más importante para esta consulta es an entry at bugs.mysql.com. Yev, utilizando MySQL 5.1.22, dice que cuando actualizó desde la versión de controlador 5.0.4 a 5.1.5, sus alias de columna dejaron de funcionar. Cuando se le preguntó si era un error.

Sebastien respondió: "No, no es un error. Es un cambio de comportamiento documentado en todas las versiones posteriores del controlador". y sugirió usar ?useOldAliasMetadataBehavior=true, citando documentation for the JDBC driver.

Advertencia Lector: La documentación para el controlador JDBC establece que

useColumnNamesInFindColumn es preferible a useOldAliasMetadataBehavior a menos que necesite el comportamiento específico que proporciona con respecto a ResultSetMetadata.

No he tenido tiempo de investigar por completo lo que esto significa. En otras palabras, no sé cuáles son todas las ramificaciones del uso de useOldAliasMetadataBehavior=true. Úselo bajo su propio riesgo. ¿Alguien más tiene más información?

0

No sé RJDBC, pero en algunos casos en que es necesario dar alias permanentes a las columnas sin cambiar el nombre de ellos, se puede utilizar vistas

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

... y luego ...

SELECT b FROM v_table 
+0

Esto es cierto, pero no sería más que una solución para el problema publicado aquí. – ROLO

0

Hay una función separada en la interfaz ResultSetMetaData para recuperar la columna etiqueta vs la columna nombre:

String getColumnLabel(int column) throws SQLException; 

Obtiene título sugerido de la columna designada para su uso en las impresiones y pantallas. El título sugerido generalmente se especifica mediante la cláusula SQL AS . Si no se especifica un SQL AS, el valor devuelto desde getColumnLabel será el mismo que el valor devuelto por el método getColumnName.

El uso de getColumnLabel debe resolver este problema (si no, verifique que su controlador JDBC esté siguiendo esta especificación).

p. Ej.

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

Este es el trabajo en torno a que utilizamos para R y SAP HANA mediante RJDBC:

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

no es el mejor trabajo en torno, pero como solución de Aaron hace el trabajo por nosotros, nos fuimos con esta solución".

Cuestiones relacionadas