我遇到了以下问题:
我想从我的CouchDB数据库中请求一个文档及其所有附件,而无需多次调用。我打以下电话给
value = mydb.get(docid = key, attachments = True, latest = True)
这个电话是基于我在http://docs.couchdb.org/en/latest/api/document/common.html和http://couchdbkit.org/docs/api/couchdbkit.client.Database-class.html#get
通话后,我在下找到
value["_attachments"]["some_attachment_name"]["data"]
内容如下:
woACfXEBKFUFdGh1bWJVQWh0dHA6Ly9zdGF0aWMyLmJpZ3N0b2NrcG...
这本应该是一本经过修改的字典(cpickle
,protocol=2),但它显然不是,否则那里会有可读的东西(我无法解开它)。我假设它被压缩和/或转换为base64。
当使用fetch_attachment
时,我可以毫无问题地取消拾取,所以看起来fetch_attachment会自动解压缩/解码,而get(...attachments = True...)
不会。
以下是我在default.ini中的CouchDB压缩配置:
file_compression = snappy
compression_level = 9
这里是value["_attachments"]["some_attachment_name"]的内容:
{
#I use octet-stream for binary data
"content_type" : "application/octet-stream",
"data" : "woACfXEBKFUFdGh1bWJVQWh0dHA6Ly9zdGF0aWMy...
"digest" : "md5-wItlEd2ZXkU3HF2TA9yiOg==",
"revpos" : 2
}
因此,实际的问题是:如何解压缩/解码数据,最干净的方法是什么
在有人开始问我为什么使用cPickle而不是直接将字典写入CouchDB之前,让我提前说,我有自己的理由,我不打算离开cPickle。我还打算保留*.ini文件中的压缩选项。
好吧,我问的时候几乎回答了我自己的问题:D当我进一步阅读文档时,我偶然发现了这一点:
数据(字符串):Base64编码内容
因此是base64代码,而不是压缩的。我所要做的就是
import base64
...
value = mydb.get(docid = key, attachments = True, latest = True)
decoded_data = base64.b64decode(value["_attachments"]["some_attachment_name"]["data"])
我希望这对某人有帮助。
此外,当我思考我的问题时,如果CouchDB在发送响应之前没有自动解压缩压缩数据,那会有点奇怪。