python中的持久dict,由sqlite3和pickle备份,多线程安全。
sqlitedict的Python项目详细描述
一个围绕python的sqlite3数据库的轻量级包装器,带有一个简单的pythonic 类似dict的接口和对多线程访问的支持:
>>>fromsqlitedictimportSqliteDict>>>mydict=SqliteDict('./my_db.sqlite',autocommit=True)>>>mydict['some_key']=any_picklable_object>>>printmydict['some_key']# prints the new value>>>forkey,valueinmydict.iteritems():>>>printkey,value>>>printlen(mydict)# etc... all dict functions work>>>mydict.close()
pickle在内部用于(反)序列化值。键是任意字符串, 值任意可pickle对象。
如果不使用autocommit(默认情况下不使用autocommit来提高性能),则 完成事务时,不要忘记调用mydict.commit():
>>># using SqliteDict as context manager works too (RECOMMENDED)>>>withSqliteDict('./my_db.sqlite')asmydict:# note no autocommit=True...mydict['some_key']=u"first value"...mydict['another_key']=range(10)...mydict.commit()...mydict['some_key']=u"new value"...# no explicit commit here>>>withSqliteDict('./my_db.sqlite')asmydict:# re-open the same DB...printmydict['some_key']# outputs 'first value', not 'new value'
功能
值可以是任何可选择的对象(使用cPickle和最高协议)。
支持同一数据库文件中的多个表(=dict)。
支持从多个线程访问同一连接(例如pyro需要)。 香草sqlite3给你ProgrammingError: SQLite objects created in a thread can only be used in that same thread.
并发请求仍在内部序列化,因此这种“多线程支持” 不会给您带来任何性能优势。这是解决python中sqlite限制的方法。
支持自定义序列化或压缩:
# use JSON instead of pickle>>>importjson>>>mydict=SqliteDict('./my_db.sqlite',encode=json.dumps,decode=json.loads)# apply zlib compression after pickling>>>importzlib,pickle,sqlite3>>>defmy_encode(obj):...returnsqlite3.Binary(zlib.compress(pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)))>>>defmy_decode(obj):...returnpickle.loads(zlib.decompress(bytes(obj)))>>>mydict=SqliteDict('./my_db.sqlite',encode=my_encode,decode=my_decode)
安装
除了python本身之外,模块没有其他依赖项。python的最低版本是2.5,在python 2.6、2.7、3.3和3.4on Travis上持续测试。
使用以下命令安装或升级:
pip install -U sqlitedict
或者从source tar.gz:
python setup.py install
文档
模块中有标准的python文档字符串:
>>>importsqlitedict>>>help(sqlitedict)
(但实际上,只有提交的dict。
当心:由于python的语义,sqlitedict无法知道何时可变 在RAM中修改了sqlitedict支持的条目。例如,mydict.setdefault('new_key',[]).append(1) 将使mydict['new_key']等于空列表,而不是[1]。你需要 显式地将经过修改的对象分配回sqlitedict以获得相同的效果:
>>>val=mydict.get('new_key',[])>>>val.append(1)# sqlite DB not updated here!>>>mydict['new_key']=val# now updated
对于开发人员
安装:
# pip install nose # pip install coverage
执行所有测试:
# make test-all
要在覆盖范围内执行所有测试:
# make test-all-with-coverage
评论、错误报告
sqlitedict驻留在github上。你可以归档 在那里发布或拉取请求。
sqlitedict是在Apache 2.0 license下发布的开源软件。 版权所有(c)2011 NowRadim Řehůřek和贡献者。