2011-11-16 14 views
8

Estoy escaneando objetos de Python en Django y guardándolos en MySQL db. Hasta ahora he seguido estas sencillas reglas:Guardar Python Objetos en escabeche en MySQL db

  1. cPickle.dumps(object) # para convertir objeto de Python a objeto estibado

  2. cPickle.loads(pickled_object) # cargar volver el objeto de pitón objeto estibado

  3. Mi Django Model Field es Text Field

  4. MySQL db field Tipo es longblob Attrib nutos binary

  5. MySQL db codificación es utf8_unicode_ci

Desafortunadamente estoy consiguiendo siguiente error durante la carga de la espalda objeto Python.

Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',)) 

Me parece mirando en valor de error x07xb6x0bx06 esto es un problema de codificación. ¿Perdí algún paso importante? ¿¿Puede alguien ayudarme a solucionar este problema??

+1

¿Tiene una razón concreta para usar pepinillo? Es un formato binario y solo puede ser usado por Python. Si tiene una opción, ¿JSON no sería una mejor opción? –

+0

JSON no cumple mi propósito, intento usar 'json.dumps' pero tengo este error' algún_objeto no es JSON serializable'. Y el objeto es puro pitónico. –

+2

Debería tratar de hacer que ese objeto sea serializable también. Es una * gran * ayuda tener elementos legibles para humanos en tu base de datos cuando tratas de encontrar un error. –

Respuesta

5

Si está intentando almacenar la salida de cPickle.dumps en una columna VARCHAR, su problema es que está intentando almacenar una cadena de bytes en una columna de caracteres. La solución en ese caso es codificar su objeto como unicode(base64.encode(cPickle.dumps(myobject))) y luego almacenarlo.

alternativa:

object2varchar = lambda obj: unicode(base64.encode(cPickle.dumps(obj))) 
store(object2varchar([1, 'foo'])) 
1

una regla más: conéctese a mysql con la opción charset=utf8?

UPD1: A veces es una buena idea buscar en la consulta SQL completa, por lo general hacerlo de esa manera:

>>> conn = MySQLdb.connect(**db_params) 
>>> "INSERT INTO tbl VALUES (%s)" % conn.literal((your_pickled_item,)) 
+0

No, esto no me ayuda. El mismo error otra vez. –

+0

@ aamir-adnan, ¿ha intentado guardar y leer un nuevo elemento en lugar de leerlo ya guardado? – newtover

+0

Una buena pregunta, sí lo comprobé, funciona bien cuando convierto y restaura objeto python dentro de código, es un problema con DB mientras lee o no almacena correctamente. ¿Que debería hacer? por favor ayuda. –