Хранить словарь в базе данных
Я создаю базу данных 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.