在MySQL db中保存Python Pickled对象

时间:2011-11-16 10:24:41

标签: python mysql django pickle

我在Django中腌制Python对象并将其保存在MySQL db中。 到目前为止,我遵循了这些简单的规则:

  1. cPickle.dumps(object)#将python对象转换为pickle对象

  2. cPickle.loads(pickled_object)#从pickled对象加载python对象

  3. 我的Django Model FieldText Field

  4. MySQL数据库字段类型为longblob属性binary

  5. MySQL数据库编码为utf8_unicode_ci

  6. 不幸的是,我在加载python对象时遇到了以下错误。

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

    在我看来,通过查看错误值x07xb6x0bx06,这是一个编码问题。 我错过了一些重要的步骤吗?任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:6)

如果您尝试将cPickle.dumps的输出存储在VARCHAR列中,那么您的问题是您尝试将字节字符串存储在字符列中。在这种情况下,修复方法是将对象编码为unicode(base64.encode(cPickle.dumps(myobject))),然后存储它。

或者:

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

答案 1 :(得分:1)

还有一条规则:使用选项charset=utf8连接到mysql?

UPD1: 有时候查看完整的SQL查询是个好主意,我通常这样做:

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

答案 2 :(得分:0)

Newtover的回答可能是正确的,但请看

https://github.com/bradjasper/django-pickledfield

它确实为我节省了一些时间,并且可以存储你想要的任何东西。

答案 3 :(得分:0)

您现在就可以尝试! django-picklefield https://pypi.org/project/django-picklefield/

要使用,只需在模型中定义一个字段即可:

>>> from picklefield.fields import PickledObjectField
... class SomeObject(models.Model):
...     args = PickledObjectField()

并将您喜欢的(只要是可腌制的)分配给该字段:

>>> obj = SomeObject()
>>> obj.args = ['fancy', {'objects': 'inside'}]
>>> obj.save()