Python desktopcouch存储dict

时间:2011-12-18 00:33:18

标签: python dictionary nosql couchdb record

首先,desktopcouch.records.server.CouchDatabase的一个奇怪的行为:

db.get_record(id)返回:

<desktopcouch.records.RecordDict object at 0x9198f2c>

db.get_records('mytype', True)返回数组:

<Row id='5rMlni6ZYudp5gvSADve1Y', key='mytype', ...>

db为CouchDatabase('mydb', create=True)

为什么会出现这种差异?

这导致我的dict被保存在记录中作为空dict {},首先是<desktopcouch.records.RecordDict object at 0x9198f2c>,第二种情况下是{}。

使用db.get_record(id)获取并使用db.update_fields(id,record)进行更新时会出现一些问题。抛出''Document'对象没有属性'read''

我在哪里做错了?

编辑:

我向Desktop CouchDB发布了一个错误,其中包含解释和摘要以重现此行为https://bugs.launchpad.net/desktopcouch/+bug/905913

1 个答案:

答案 0 :(得分:1)

通过查看它的代码,我发现它不是一个普通的字典,但无论如何你都可以把它变成dict。

试试这个:

print dict(tmp['logs'].items())

修改

至于混淆,当您将转换后的dict设置回Record对象时,它会运行

super(Record, self).__setitem__(key, item)

因此,根据其继承,它运行RecordDict对象的__setitem__方法,该方法运行:

super(RecordDict, self).__setitem__(key, item)

再次,请参阅RecordData对象的__setitem__方法,它是:

def __setitem__(self, key, item):
    if isinstance(item, (list, tuple, dict)):
        item = record_factory(item)
    if hasattr(item, '_data'):
        item = item._data
    self._data[key] = item

因此,它使用record_factory将您解析的字典再次转换为RecordDict。所以你看到了那些结果:)