python中的持久dict,由sqlite3和pickle备份,多线程安全。

sqlitedict的Python项目详细描述


TravisLicense

一个围绕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和贡献者。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用测试类查看两个整数值是否适合参数   java Apache Tomcat 7域问题代理设置   java排序从程序计算的分数   java发送批量通知,希望决定调度程序的时间频率   避免全局状态的REST服务器java存储和加载配置(即单例与上下文、依赖注入)   单击按钮时的java选择方法   java Sringboot日志文件与logbakspring一起工作不正常。xml   java为什么匕首注入不起作用,而是组件。getObject是   java一个表达式包含“最多一个副作用,作为其最外层的操作”,这意味着什么?   java如何从文本文件读取/加载此HashMap?   java如何从菜单处理程序重新实例化零件类?   计划任务如何使用在不同机器上运行的多个java程序访问同一个表而不会出现死锁   多线程循环的java效率   java使用已经获取的MySQL数据行向DIV追加新的MySQL数据   java允许不带引号的soap操作JAXWS