我在Django中腌制Python对象并将其保存在MySQL db中。 到目前为止,我遵循了这些简单的规则:
cPickle.dumps(object)
#将python对象转换为pickle对象
cPickle.loads(pickled_object)
#从pickled对象加载python对象
我的Django Model Field
是Text Field
MySQL数据库字段类型为longblob
属性binary
MySQL数据库编码为utf8_unicode_ci
不幸的是,我在加载python对象时遇到了以下错误。
Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',))
在我看来,通过查看错误值x07xb6x0bx06
,这是一个编码问题。
我错过了一些重要的步骤吗?任何人都可以帮我解决这个问题吗?
答案 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()