Хранить словарь в базе данных

Я создаю базу данных Berkeley и работаю с ней с помощью модуля 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']

Как я могу это сделать?

2 ответа

Итак, во-первых, я думаю, вы должны открыть свою базу данных, используя скобки:

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

Имейте в виду, что шаблон Беркли является ключом -> значением, где и ключ, и значение являются строковыми объектами (не в Юникоде). Лучший способ в вашем случае будет использовать:

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

так как ваши заметки совместимы с синтаксисом json.

Однако, это не очень хороший выбор, скажем, если вы хотите запрашивать только комментарии пользователей. Вы должны использовать реляционную базу данных, такую ​​как sqlite, которая также встроена в Python.

Простое решение было описано @Falvian.

Для начала есть шаблон столбца в упорядоченном хранилище ключей / значений. Таким образом, шаблон ключ / значение не единственный.

Я думаю, что bsddb является жизнеспособным решением, когда вы не хотите полагаться на sqlite. Первый подход заключается в создании 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) прежде чем хранить их.

Если вам нужно создать индекс. Я рекомендую вам взглянуть на другой мой ответ, представляющий составные ключи для построения индекса в bsddb.

Другие вопросы по тегам