También he estado luchando con este problema durante varios meses. Sin embargo, he encontrado una solución que también puede ayudarte.
En pocas palabras, el problema ocurre cuando ciertas columnas de texto no aparecen después de las columnas de números enteros o numéricos. Cuando las columnas no están alineadas correctamente en la consulta, aparece un error de invalid index
se lanza y su conexión puede congelarse. Entonces, el problema es, ¿cómo sé qué poner al final de mi consulta?
Para determinar esto, normalmente se podría examinar una columna usando class()
o typeof()
. Para examinar dicha información de la base de datos, puede utilizar una consulta como:
dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table")) # You may not require the schema part...
Esto devolverá una tabla con un campo de tipo para cada columna en el conjunto de datos de interés. Luego puede usar esta tabla como un índice para ordenar el select()
declaración. Mi dificultad particular es que el type
campo en la tabla era todos los números! Sin embargo, noté que cada columna con un número negativo, cuando se colocaba al final de la declaración de selección, solucionaba mi consulta y podía extraer toda la tabla sin problemas. Por ejemplo, mi solución completa :
# Create my index of column types (ref to the current order)
index <- dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table"))
index$type <- as.integer(index$type) # B/c they are + and - numbers!
# Create the ref to the table
mySQLTbl <- tbl(con, in_schema("schema", "tablename"))
# Use the select statement to put all the + numbered columns first!
mySQLTbl %>%
select(c(which(index$type>=0),
which(index$type<0)))
En cuanto a la razón por la que esto ocurre, no estoy seguro y no tengo los privilegios de acceso a datos para profundizar mucho más en mi caso de uso