0

这是我在搁置中更新记录的代码

def updateRecord(db, form):
    if not 'key' in form:
        fields = dict.fromkeys(fieldnames, '?')
        fields['key'] = 'Missing key input'
    else:
        key = form['key'].value
        if key in db:
            record = db[key]
        else:
            from person import Person
            record = Person(name='?',age='?')
        for field in fieldnames:
            setattr(record, field, eval(form[field].value))
        db[key] = record
        fields = record.__dict__
        fields['key'] = key
    return fields

当我试图从搁置中检索值时,我收到此错误

>>> import shelve
>>> db = shelve.open('class-shelve')
>>> db['sue'].name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/shelve.py", line 121, in __getitem__
    f = StringIO(self.dict[key])
  File "/usr/lib/python2.7/bsddb/__init__.py", line 270, in __getitem__
    return _DeadlockWrap(lambda: self.db[key])  # self.db[key]
  File "/usr/lib/python2.7/bsddb/dbutils.py", line 68, in DeadlockWrap
    return function(*_args, **_kwargs)
  File "/usr/lib/python2.7/bsddb/__init__.py", line 270, in <lambda>
    return _DeadlockWrap(lambda: self.db[key])  # self.db[key]
KeyError: 'sue'

任何见解发生了什么?

4

1 回答 1

1

假设在第一个片段中,db变量是一个“架子”对象,那么,虽然该行......

db[key] = record

...会将新的键/值对添加到“架子”,它不一定会将内容刷新到磁盘,因此共享相同“架子文件”的其他进程将无法使用它。

您可以通过添加以下行来强制将“架子文件”写入磁盘...

db.sync()

...在添加新的键/值对之后,但是当你的“架子文件”变大时它可能会很慢,所以你可能不想太频繁地调用它。

于 2013-05-19T12:53:24.020 回答