Python 如何在MongoDB中存储锁对象?
我有一个put和get函数,可以插入MongoDB:Python 如何在MongoDB中存储锁对象?,python,mongodb,pymongo,pickle,Python,Mongodb,Pymongo,Pickle,我有一个put和get函数,可以插入MongoDB: def put(self,key,value): key = self.path+"&&"+key value1 = Binary(pickle.dumps(value)) entry = {"keyname":key,"info":value1} self.filenode.update({"keyname":key}, { "$set" : entry }, upsert=Tru
def put(self,key,value):
key = self.path+"&&"+key
value1 = Binary(pickle.dumps(value))
entry = {"keyname":key,"info":value1}
self.filenode.update({"keyname":key}, { "$set" : entry }, upsert=True)
def get(self,key):
key1 = key
key = self.path+"&&"+key
res = self.filenode.find_one({"keyname":key})
if "info" in res:
x = res["info"]
res1 = pickle.loads(x)
return res1
else:
return None
如果put中的值是简单类型(如字符串、dict等),则此操作有效。但如果值是对象,则无法在put函数中pickle。我得到的错误是:
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError:无法pickle lock对象请阅读Python关于序列化的文档-。如果控制对象的定义,则可以提供一个
\uu getstate\uu()
方法,该方法可以删除不可序列化的属性,如锁
我使用它将锁设置为
None
,然后使用\uuu setstate\uu()
作为反序列化钩子来重新初始化锁。阅读一下Python关于序列化的文档-。如果控制对象的定义,则可以提供一个\uu getstate\uu()
方法,该方法可以删除不可序列化的属性,如锁
我使用它将锁设置为
None
,然后使用\u setstate\u()
作为反序列化钩子来重新初始化锁。您可以使用更好的序列化程序,如dill
,它可以对锁和python中的大多数对象进行pickle处理
>>> import threading
>>> l = threading.Lock()
>>>
>>> import dill
>>> dill.dumps(l)
'\x80\x02cdill.dill\n_create_lock\nq\x00\x89\x85q\x01Rq\x02.'
然后,通过首先转换为pickle字符串,您可以将大多数对象保存到数据库。您可以使用更好的序列化程序,如dill
,它可以pickle锁和python中的大多数对象
>>> import threading
>>> l = threading.Lock()
>>>
>>> import dill
>>> dill.dumps(l)
'\x80\x02cdill.dill\n_create_lock\nq\x00\x89\x85q\x01Rq\x02.'
然后,通过首先转换为pickle字符串,可以将大多数对象保存到数据库中