【问题标题】:Store dictionary in database在数据库中存储字典
【发布时间】:2014-02-21 12:42:33
【问题描述】:

我创建了一个伯克利数据库,并使用 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']

我该怎么做?

【问题讨论】:

    标签: python berkeley-db bsddb


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      如果需要创建索引。我建议你看看我的另一个answer introducting composite keys to build index in bsddb

      【讨论】:

        猜你喜欢
        • 2011-02-22
        • 2013-03-14
        • 2011-01-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2018-02-12
        • 1970-01-01
        相关资源
        最近更新 更多