1

我创建了一个伯克利数据库,并使用 bsddb 模块对其进行操作。我需要以一种风格存储信息,如下所示:

username = '....'
notes = {'name_of_note1':{
                          'password':'...',
                          'comments':'...',
                          'title':'...'
                         }
         'name_of_note2':{
                           #keys same as previous, but another values
                         }
        }

这就是我打开数据库的方式

db = bsddb.btopen['data.db','c']

我怎么做 ?

4

2 回答 2

1

所以,首先,我想你应该用括号打开你的数据库:

db = bsddb.btopen('data.db','c')

请记住,Berkeley 的模式是 key -> value,其中 key 和 value 都是字符串对象(不是 unicode)。在您的情况下,最好的方法是使用:

db[str(username)] = json.dumps(notes)

因为您的笔记与 json 语法兼容。

但是,这不是一个很好的选择,例如,如果您只想查询用户名的评论。您应该使用关系数据库,例如 sqlite,它也是 Python 内置的。

于 2014-05-01T22:36:07.560 回答
0

@Falvian 描述了一个简单的解决方案。

首先,有序键/值存储中有一个列模式。所以键/值模式不是唯一的。

我认为当您不想依赖 sqlite 时,bsddb 是可行的解决方案。第一种方法是创建一个documents = bsddb.btopen['documents.db','c']并存储在 json 值中。关于键,您有几个选择:

  • 自己命名键,就像你一样"name_of_note_1""name_of_note_2"
  • 使用生成随机标识符uuid.uuid4(不要忘记检查它是否尚未使用;)
  • 或者使用其中的一行来存储一个计数器,您将documents使用key=0它来创建 uids(唯一标识符)。

如果您使用整数,请不要忘记lambda x: struct.pack('>q', uid)在存储它们之前将它们打包。

如果需要创建索引。我建议您查看我的其他答案,介绍复合键以在 bsddb 中构建索引

于 2015-08-21T19:21:47.360 回答