2011-11-16 44 views
8

我正在酸洗Python中的Django對象並將它保存在MySQL數據庫中。 到目前爲止,我已經遵循這些簡單的規則:在Python中保存Python Pickled對象db

  1. cPickle.dumps(object) q若要Python對象轉換成醃對象

  2. cPickle.loads(pickled_object)#從醃製對象加載回Python對象

  3. 我的Django Model FieldText Field

  4. MySQL db field類型是longblob Attrib UTES binary

  5. MySQL數據庫的編碼是utf8_unicode_ci

不幸的是我得到以下錯誤而載入回到Python對象。

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

在我看來,通過查看錯誤值x07xb6x0bx06這是一個編碼問題。 我錯過了一些重要的步驟?任何人都可以幫我解決這個問題嗎?

+1

你有一個特別原因需要使用泡菜?這是一種二進制格式,只能用於python。如果你有選擇,JSON不是更好的選擇嗎? –

+0

JSON不服務我的目的,我嘗試使用'json.dumps',但得到這個錯誤'some_object不是JSON序列化'。而對象是純Pythonic。 –

+2

您應該嘗試使該對象也可以serialisable。當您嘗試查找錯誤時,在您的數據庫中有可讀的東西是一個很大的幫助。 –

回答

5

如果您嘗試將cPickle.dumps的輸出存儲在VARCHAR列中,那麼您的問題是您試圖將字節字符串存儲在字符列中。在這種情況下的修復是將您的對象編碼爲unicode(base64.encode(cPickle.dumps(myobject))),然後將其存儲。

或者:

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

另外一個規則:連接到mysql與選項charset=utf8

UPD1: 有時是看完整的SQL查詢是個好主意,我通常這樣做的:

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

不,這不幫助我。同樣的錯誤再次。 –

+0

@ aamir-adnan,你是否嘗試過保存並讀取新的項目,而不是讀取已保存的項目? – newtover

+0

好問題,是的,我檢查了它,它工作正常,當我轉換和恢復代碼內的python對象時,它是閱讀或不正確存儲數據庫時的問題。我該怎麼辦?請幫忙。 –