2011-11-16 9 views
8

Sto sottoponendo a Python Objects in Django e salvandolo in MySQL db. Finora ho seguito queste semplici regole:Salvataggio di oggetti in Python decapitati in MySQL db

  1. cPickle.dumps(object) #to convertono oggetto python per oggetto in salamoia

  2. cPickle.loads(pickled_object) # per caricare di nuovo l'oggetto Python da oggetto in salamoia

  3. mio Django Model Field è Text Field

  4. Il campo di tipo Db MySQL è longblob Attrib. sce binary

  5. MySQL codifica db è utf8_unicode_ci

Purtroppo sto ottenendo seguente errore durante il caricamento di nuovo oggetto Python.

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

Mi sembra, cercando il valore di errore x07xb6x0bx06 questo è un problema di codifica. Mi sono perso un passaggio importante ?? Qualcuno può aiutarmi a risolvere questo problema ??

+1

Avete un motivo specifico per utilizzare salamoia? È un formato binario e utilizzabile solo da python. Se hai una scelta, JSON non sarebbe un'opzione migliore? –

+0

JSON non server il mio scopo, provo a usare 'json.dumps' ma ho ricevuto questo errore' some_object non è serializzabile su JSON'. E l'oggetto è puro Pythonic. –

+2

Dovresti provare a rendere anche quell'oggetto serializzabile. È un * grande * aiuto per avere materiale leggibile nel tuo db quando stai cercando di trovare un bug. –

risposta

5

Se si sta tentando di memorizzare l'output di cPickle.dumps in una colonna VARCHAR, il problema è che si sta tentando di memorizzare una stringa di byte in una colonna di caratteri. In tal caso, la correzione è quella di codificare l'oggetto come unicode(base64.encode(cPickle.dumps(myobject))) e quindi memorizzarlo.

alternativa:

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

un'altra regola: connettersi a mysql con l'opzione charset=utf8?

UPD1: A volte è una buona idea di guardare la query completa SQL, io di solito fare in questo modo:

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

No, questo non mi aiuta. Lo stesso errore di nuovo. –

+0

@ aamir-adnan, hai provato a salvare e leggere un nuovo elemento invece di leggere già salvato? – newtover

+0

Buona domanda, sì l'ho controllato, funziona bene quando converto e ripristino l'oggetto python all'interno del codice, è un problema con db durante la lettura o la memorizzazione non corretta. Cosa dovrei fare? per favore aiuto. –

Problemi correlati