Python couchdbkit:如何使用附件进行批量保存
我使用的是couchdbkit(Python2.7),我需要一次批量保存大约100个新项目。我想同时保存有效负载(=附件)和元数据(=文档) 现在我一个一个地保存这些项目的效率非常低,因为couchdbkit只允许在数据库中已经存在文档之后Python couchdbkit:如何使用附件进行批量保存,python,save,attachment,bulk,couchdbkit,Python,Save,Attachment,Bulk,Couchdbkit,我使用的是couchdbkit(Python2.7),我需要一次批量保存大约100个新项目。我想同时保存有效负载(=附件)和元数据(=文档) 现在我一个一个地保存这些项目的效率非常低,因为couchdbkit只允许在数据库中已经存在文档之后put\u attachment()。这迫使我执行得非常慢。当我想保存一个项目时,我需要按固定顺序进行两次通信:第一次save()项目,第二次put_attachment() 我想要的是在本地创建所有带有\u附件的文档,并立即发送所有内容。以下代码无效,因为b
put\u attachment()
。这迫使我执行得非常慢。当我想保存一个项目时,我需要按固定顺序进行两次通信:第一次save()
项目,第二次put_attachment()
我想要的是在本地创建所有带有\u附件的文档
,并立即发送所有内容。以下代码无效,因为bulk\u save
不处理附件[编辑:不正确,请参阅我的答案]
def setInBulk(self, key2value):
datetimeprop = DateTimeProperty()
def createItemToSave(thekey, thevalue):
pickled = cPickle.dumps(obj = value, protocol = 2).decode('latin1')
item = {"_id": key, "content": {"seeattachment": True, "ispickled" : True}, "creationtm": datetimeprop.to_json(datetime.datetime.utcnow()), "lastaccesstm": datetimeprop.to_json(datetime.datetime.utcnow())}
item ["_attachments"] = {
"theattachment":
{
"content_type":"application/octet-stream",
"data": pickled.encode('utf-8')
}
}
return item
docs = []
for key, value in key2value.iteritems():
docs.append(createItemToSave(key, value))
#this is what I want but it seems not to work
self.db.bulk_save(docs, all_or_nothing = True)
我怎样才能绕过couchdbkit强加给我的每次写一次的限制?我让它工作了!事实证明,
bulk\u save
确实正确处理了\u附件
字段。我做错的是数据编码。这是我的新代码:
def setInBulk(self, key2value):
datetimeprop = DateTimeProperty()
boolprop = BooleanProperty() #added
def createItemToSave(thekey, thevalue):
pickled = cPickle.dumps(obj = value, protocol = 2).decode('latin1')
#modified: usage of BooleanProperty for booleans
item = {"_id": key, "content": {"seeattachment": boolprop.to_json(True), "ispickled" : boolprop.to_json(True)}, "creationtm": datetimeprop.to_json(datetime.datetime.utcnow()), "lastaccesstm": datetimeprop.to_json(datetime.datetime.utcnow())} #modified
item ["_attachments"] = {
"theattachment":
{
"content_type":"application/octet-stream",
#modified: base64 encoding needed
"data": base64.encodestring(pickled.encode('utf-8'))
}
}
return item
docs = []
for key, value in key2value.iteritems():
docs.append(createItemToSave(key, value))
self.db.bulk_save(docs, all_or_nothing = True)
首先,我还添加了BooleanProperty的用法,以确保所有内容都与JSON兼容
其次,我未能对数据进行base64编码。需要纯且未过滤的base64代码
不要尝试筛选base64代码。couchdb说“请注意,您发送的任何base64数据都必须在一行字符上,所以请预处理您的数据以删除任何回车和换行符。”这让我感到困惑。建议进行类似的筛选。这本身可能是正确的,但是bulk\u save()
似乎已经解决了这一问题,并且重复两次只会导致“不匹配”错误