Что лучший способ состоит в том, чтобы сохранить и получить Python dict в базе данных?
Если вы не заинтересованы в использовании традиционно SQL баз данных, таких как MySQL, вы можете рассмотреть неструктурированные базы данных документов, где документы естественно отображаются на словари python, например MongoDB. Связки MongoDB python позволяют просто вставлять словари в БД и запрашивать их на основе значений в словаре. Смотрите, например, приведенный ниже код из учебника:
>>> from pymongo import Connection
>>> connection = Connection()
>>> db = connection['test-database']
>>> import datetime
>>> post = {"author": "Mike",
... "text": "My first blog post!",
... "tags": ["mongodb", "python", "pymongo"],
... "date": datetime.datetime.utcnow()}
>>> posts = db.posts
>>> posts.insert(post)
ObjectId('...')
>>> posts.find_one({"author": "Mike"})
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
Довольно расплывчатый вопрос, во многом зависит от вариантов использования.
Обычно вы просто сериализуете его и вставляете там, где это необходимо, но если вам нужно, чтобы сам словарь был «похож на базу данных», вы можете использовать одно из множества доступных хранилищ ключей / значений. для Python
Если dict напрямую соответствует таблице базы данных, вы должны создать таблицу со схемой, содержащей два столбца - ключ
и значение
. Затем для каждого элемента dict просто вставьте его в базу данных или обновите, если ключ уже на месте, и т. Д.
В противном случае вы можете использовать pickle для сериализации dict в строку, а затем вы можете просто сохранить строку в БД. Но в целом я бы не рекомендовал это решение, поскольку вы не можете запрашивать сериализованные данные.
«Лучшее» спорно.
Если вам нужна СУБД, sqlite встроен; так что это можно считать более простым методом, чем некоторые другие упомянутые способы.
import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("create table kv (key text, value integer);")
# <sqlite3.Cursor object at 0x00C62CE0>
d = {'a':1,'b':2}
c.executemany("insert into kv values (?,?);", d.iteritems())
# <sqlite3.Cursor object at 0x00C62CE0>
c.execute("select * from kv;").fetchall()
# [(u'a', 1), (u'b', 2)]