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字符串池(字符串和字符串缓冲区)   java如何通过entryid从kaltura获取文件url   java如何通过Oracle服务总线重定向请求   java RecyclerView我最多只能添加一行   java如何防止Paho在处理来自代理的消息后发送ACK?   java从泛型方法调用重载方法   java如何使javac编译我的多语言程序   java Log4j不会在删除时重新创建文件   java如何设置Zk会话(org.zkoss.Zk.ui),以便对扩展GenericForwardComposer的控制器类进行单元测试   Java:为什么可以对通配符集合进行强制转换?   java如何将数据更新到从自定义视图类创建的对象,以便可以在自定义视图上绘制数据?   java如何解决在片段中使用意图时应用程序崩溃的问题?   java如何使来自JSP的Servlet调用更安全?   java在Lucene中索引正则表达式并搜索输入   java如何设置Jetty,使其与Tomcat对等,同时支持JSP和servlet?   java在检查和使用对话框输入时遇到问题   java Git可以在签出时更改文件吗?