Python 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

我使用的是couchdbkit(Python2.7),我需要一次批量保存大约100个新项目。我想同时保存有效负载(=附件)和元数据(=文档)

现在我一个一个地保存这些项目的效率非常低,因为couchdbkit只允许在数据库中已经存在文档之后
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()
似乎已经解决了这一问题,并且重复两次只会导致“不匹配”错误