数据库建议用于字典存储

时间:2011-11-02 03:31:16

标签: python database recommendation-engine

使用Python我设法使自己成为一种术语及其含义的字典,它相当大 - x00,000项(现在无法估计,因为它们以第一个字母存储在多个文件中)。
文件是具有以下结构的pickle字典对象:

dict{word, (attribute,
            kind,
            [meanings],
            [examples],
            [connections]
            )
    }

如果重要的是它的Python字典对象,键为字符串,值为元组,则该元组由字符串或列表对象组成。

现在我计划将它们全部放在sqlite3数据库中,因为Python很容易。在我这样做之前,我想在sqlite3之前提出建议,如果选择好,我以前从未做过任何真正的数据库任务。

我知道答案取决于我想对这些数据做什么(除了它的结构),但是我要说它只是希望它存储在一个地方(文件)本地并且合理易于访问(查询)和可能会改变。

2 个答案:

答案 0 :(得分:0)

是的,我已经将sqlite3用于此类事情。字典值必须首先被腌制:

import sqlite3
import pickle
import collections

class DBDict(collections.MutableMapping):
    'Database driven dictlike object (with non-persistent in-memory option).'

    def __init__(self, db_filename=':memory:', **kwds):
        self.db = sqlite3.connect(db_filename)
        self.db.text_factory = str
        try:
            self.db.execute('CREATE TABLE dict (key text PRIMARY KEY, value text)')
            self.db.execute('CREATE INDEX key ON dict (key)')
            self.db.commit()
        except sqlite3.OperationalError:
            pass                # DB already exists
        self.update(kwds)

    def __setitem__(self, key, value):
        if key in self:
            del self[key]
        value = pickle.dumps(value)
        self.db.execute('INSERT INTO dict VALUES (?, ?)', (key, value))
        self.db.commit()

    def __getitem__(self, key):
        cursor = self.db.execute('SELECT value FROM dict WHERE key = (?)', (key,))
        result = cursor.fetchone()
        if result is None:
            raise KeyError(key)
        return pickle.loads(result[0])

    def __delitem__(self, key):
        if key not in self:
            raise KeyError(key)
        self.db.execute('DELETE FROM dict WHERE key = (?)', (key,))
        self.db.commit()

    def __iter__(self):
        return iter([row[0] for row in self.db.execute('SELECT key FROM dict')])

    def __repr__(self):
        list_of_str = ['%r: %r' % pair for pair in self.items()]
        return '{' + ', '.join(list_of_str) + '}'

    def __len__(self):
        return len(list(iter(self)))



>>> d = DBDict(raymond='red', rachel='blue')
>>> d
{'rachel': 'blue', 'raymond': 'red'}
>>> d['critter'] = ('xyz', [1,2,3])
>>> d['critter']
('xyz', [1, 2, 3])
>>> len(d)
3
>>> list(d)
['rachel', 'raymond', 'critter']
>>> d.keys()
['rachel', 'raymond', 'critter']
>>> d.items()
[('rachel', 'blue'), ('raymond', 'red'), ('critter', ('xyz', [1, 2, 3]))]
>>> d.values()
['blue', 'red', ('xyz', [1, 2, 3])]

以上将使您将数据库保存在单个文件中。您可以像常规python字典一样导航对象。由于值在单个字段中进行pickle,因此sqlite不会为您提供任何其他查询选项。其他flatfile存储将有类似的限制。如果需要编写遍历层次结构的查询,请考虑使用NoSQL数据库。

答案 1 :(得分:0)

向我闻起来像文档存储数据库。查看CouchDB http://couchdb.apache.org/

相关问题