在MySQL数据库中保存Python pickle对象
我正在Django中处理Python对象,并将其保存在MySQL数据库中。 到目前为止,我遵循了以下简单规则:在MySQL数据库中保存Python pickle对象,python,mysql,django,pickle,Python,Mysql,Django,Pickle,我正在Django中处理Python对象,并将其保存在MySQL数据库中。 到目前为止,我遵循了以下简单规则: cPickle.dumps(object)#将python对象转换为pickle对象 cPickle.load(pickled_对象)#从pickled对象加载回python对象 My Django模型字段是文本字段 MySQL db字段类型为longblobAttributesbinary MySQL数据库编码是utf8\u unicode\u ci 不幸的是,我在加载python对
cPickle.dumps(object)
#将python对象转换为pickle对象cPickle.load(pickled_对象)
#从pickled对象加载回python对象模型字段
是文本字段
longblob
Attributesbinary
utf8\u unicode\u ci
Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',))
类型错误:(“需要一个整数”(“x07xb6x0bx06”))
在我看来,通过查看错误值x07xb6x0bx06
这是一个编码问题。
我错过了重要的一步吗??有谁能帮我解决这个问题吗?还有一条规则:使用选项
charset=utf8连接到mysql
UPD1:
有时查看完整的SQL查询是个好主意,我通常这样做:
>>> conn = MySQLdb.connect(**db_params)
>>> "INSERT INTO tbl VALUES (%s)" % conn.literal((your_pickled_item, ))
纽托弗的答案可能是正确的,但看看
它确实为我节省了一些时间,并且可以存储几乎任何您想要的内容。如果您试图将cPickle.dumps
的输出存储在VARCHAR
列中,那么您的问题是您试图将字节字符串存储在字符列中。这种情况下的修复方法是将对象编码为unicode(base64.encode(cPickle.dumps(myobject))
,然后存储它
或者:
object2varchar = lambda obj: unicode(base64.encode(cPickle.dumps(obj)))
store(object2varchar([1, 'foo']))
你现在可以试试这个!
django picklefield
要使用,只需在模型中定义一个字段:
>>> from picklefield.fields import PickledObjectField
... class SomeObject(models.Model):
... args = PickledObjectField()
并将您喜欢的内容(只要可拾取)分配给字段:
>>> obj = SomeObject()
>>> obj.args = ['fancy', {'objects': 'inside'}]
>>> obj.save()
你有使用泡菜的具体原因吗?它是二进制格式,只能由python使用。如果您有选择,JSON不是更好的选择吗?JSON不符合我的目的,我尝试使用JSON.dumps
,但出现了这个错误某些对象不可JSON序列化
。对象是纯Python的。您应该尝试使该对象也可序列化。当您试图查找bug时,数据库中有人类可读的内容是一个很大的帮助。@aamir adnan,您是否尝试保存和读取一个新项目而不是读取已保存的项目?好问题,是的,我检查了它,当我在代码中转换和还原python对象时,它工作正常。读取或未正确存储时,数据库有问题。我该怎么办?请提供帮助。@aamir adhan,我的意思是前面的项目可能以错误的编码保存,现在可以正确读取noew。而不是使用Django模型(与Django模型的行为文本字段
和MySQLblob字段
)相混淆),i直接
与数据库建立连接,并将pickle对象直接存储在数据库中。但同样的错误:-(是的,我总是更新字段,然后读取新值。我没有读取旧保存的值。