2011-11-16 89 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对象时,它是阅读或不正确存储数据库时的问题。我该怎么办?请帮忙。 –