2011-08-02 30 views
7

Tengo algunas dificultades para insertar un marco de datos en una base de datos mySql usando RODBC. A continuación se muestra el código que estoy usando:Problemas con RODBC sqlSave

data <- data.frame(analysedDataID=c(1,2,3), plateWell=c("a","b","c"), screenPlateOrder=c(1,2,3), wellData=c("A","B","C")) 

con <- odbcConnect(DSN, uid="user_id", pwd="some_password") 
query <- sqlSave(con, data, tablename = 'wellAnalysedDataTable', rownames=FALSE, append=TRUE) 

Cuando trato de ejecutar este me sale el siguiente mensaje de error:

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
missing columns in 'data' 

Aquí está la tabla específica que estoy tratando de insertar los datos en:

+------------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+------------------+-------------+------+-----+---------+-------+ 
| analysedDataID | int(10)  | YES |  | NULL |  | 
| plateWell  | varchar(10) | YES |  | NULL |  | 
| screenPlateOrder | int(10)  | YES |  | NULL |  | 
| wellData   | varchar(30) | YES |  | NULL |  | 
+------------------+-------------+------+-----+---------+-------+ 

estoy muy confundido en este punto ya que he leído la documentación una y otra vez, pero simplemente no puedo conseguir que esto funcione. ¡Cualquier ayuda sería muy apreciada!

¡Salud!


¡Gracias! Agregué los cambios que sugirió y ya no parece haber ningún problema con el caso. Sin embargo sigo recibiendo el mensaje de error:

'index column(s) analysedDataID plateWell screenPlateOrder wellData not in data frame' 

La declaración que estoy ejecutando que genera esto es:

sqlUpdate(con, data, tablename="wellAnalysedDataTable", index=c("analysedDataID", "plateWell", "screenPlateOrder", "wellData")) 

esto no tiene ningún sentido para mí como las columnas ya están en el marco de datos con los mismos colnames.

Respuesta

0
> str(data) 
'data.frame': 3 obs. of 4 variables: 
$ analysedDataID : num 1 2 3 
$ plateWell  : Factor w/ 3 levels "a","b","c": 1 2 3 
$ screenPlateOrder: num 1 2 3 
$ wellData  : Factor w/ 3 levels "A","B","C": 1 2 3 

Ha intentado hacer sus Numerics enteros y sus factores de caracteres?

data <- data.frame(analysedDataID=as.integer(c(1,2,3)), plateWell=c("a","b","c"), screenPlateOrder=as.integer(c(1,2,3)), wellData=c("A","B","C"),stringsAsFactors=FALSE) 
+0

Hola GSK3. Gracias por su respuesta. Lo intenté con los cambios sugeridos, pero aún así no pude hacerlo funcionar. Sigo recibiendo otro mensaje de error que dice: "no se puede agregar a la tabla 'wellanalyseddatatable'". Noté que la variable de nombre de tabla parece convertir el carácter de entrada en minúsculas, lo que significa que no coincide con la tabla en la que quiero insertar el marco de datos. ¿Tienes alguna idea de cómo podría hacerlo sensible a mayúsculas y minúsculas? Traté de mirar la documentación para RODBC, pero no parece mencionarlo. – hberven1

+0

Si escribe 'odbcUpdate', obtendrá la definición completa de la función. Desde allí, puede ver que el canal tiene un atributo llamado "caso", que se configura como superior o inferior. No estoy seguro de por qué no hay una opción de "preservar", pero es probable que sobrescriba odbcUpdate con su propia versión de la función. La línea correspondiente es 'cnames <- switch (attr (canal," caso "), nochange = cnames, toupper = toupper (cnames), tolower = tolower (cnames))' –

1

diferentes errores pueden llevar al mismo mensaje de error. Por lo tanto, no está claro si esto lo ayuda: , sin embargo, si "tablename = 'wellAnalysedDataTablealready' ya está creado en la base de datos mySql como una tabla vacía, obtendrá este error. Intente eliminarlo y deje que la función sqlsave (...) ocúpelo

0

Si el problema es, de hecho, con la distinción entre mayúsculas y minúsculas, parece que hay una solución fácil sin cambiar ninguna función utilizando la opción "conservar", que aparece en la línea indicada por Ari B. Friedman : "nochange = CNAMEs" Por lo tanto, cuando se crea inicialmente el canal de RODBC, sólo tiene que especificar que como la opción de caso:..

my_sql_channel <<- odbcConnect("myOdbc", case="nochange") 
0

tengo el mismo error y el problema era los tipos de datos de la tabla de destino Incluso parece que hubo una posible conversión de datos.
Los pasos de la solución fueron:

  1. uso un nombre de tabla sin usar (nueva tabla);
  2. set append = False y aparece la "tabla de creación" mostrada en el mensaje de error;
  3. ejecución que crea una tabla en la base de datos;
  4. el "saveSql" ahora funciona con append = False o append = True.

Es útil establecer "verbose = T" para comprobar exactamente dónde se produce el problema.

13

muy vieja cuestión sé, pero tuve (y resuelto por mi ejemplo) el mismo problema hace un momento, conseguir este error

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
    missing columns in 'data' 

el uso de

sqlSave(

En el paquete RODBC.

Lo resuelto mediante el establecimiento de

,fast = F 

Si alguien más desde el primer Google Resultados tierras aquí, espero que esta ayuda

+0

¿Alguna idea de por qué esto debería marcar la diferencia? – keuleJ

+0

Lo rápido = F, solo significa que inserta los datos fila por fila. No tengo idea de por qué hacerlo en lote (rápido = T) causa un problema. No uso sqlSave si tengo que hacer esto más. En general solo uso sqlQuery y para cada fila uso paste para hacer una cadena. – ChristyCasey