2009-06-10 61 views
5

Estoy usando Python y su módulo MySQLdb para importar algunos datos de medición en una base de datos Mysql. La cantidad de datos que tenemos es bastante alta (actualmente aproximadamente ~ 250 MB de archivos csv y mucho más por venir).Python + MySQLdb executemany

Actualmente utilizo cursor.execute (...) para importar algunos metadatos. Esto no es problemático ya que solo hay unas pocas entradas para estos.

El problema es que cuando intento utilizar cursor.executemany() para importar grandes cantidades de los datos de medición reales, MySQLdb plantea una

TypeError: not all arguments converted during string formatting 

Mi código actual es

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into values (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 

donde values es una lista de tuplas que contienen tres cadenas cada una. Alguna idea de lo que podría estar mal con esto?

Editar:

Los valores son generados por

yield (prefix + row['id'], row['value'], sample_id) 

y luego lee en una lista de mil en un momento en fila es iterador y procedentes de csv.DictReader.

+1

¿Ha verificado que los valores contienen los datos correctos? Como comentario adicional, debe considerar el uso de LOAD LOCAL DATA INFILE. Puede ser mucho más rápido. –

+0

El problema es que los datos deben preprocesarse (lo que se hace actualmente en el mismo script de python) y no es muy viable crear copias redundantes de conjuntos de datos tan grandes. Los valores deberían estar bien ya que lo comprobé con un depurador. – lhahne

Respuesta

7

En retrospectiva, esta fue una muy estúpida bu Es difícil detectar el error. Los valores son una palabra clave en sql, por lo que los valores del nombre de la tabla necesitan comillas a su alrededor.

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into `values` (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 
3

El mensaje que recibe indica que dentro del método executemany(), una de las conversiones falló. Compruebe su lista values para una tupla más de 3.

Para una verificación rápida:

max(map(len, values)) 

Si el resultado es mayor que 3, localizar su mala tupla con un filtro:

[t for t in values if len(t) != 3] 

o, si necesita el índice:

[(i,t) for i,t in enumerate(values) if len(t) != 3] 
+0

Gracias, pero ese no es el problema. Todas las tuplas tienen la longitud correcta. – lhahne

+0

Bueno, ahora verifique que su formato tenga el número correcto de% s ... – gimel

Cuestiones relacionadas