基于json的文档数据库
lindh-jsondb的Python项目详细描述
jsondb
纯python 3中的json键值存储
简介
jsondb是python 3的一个库,它提供了运行 简化的couchdb类文档数据库,也称为键值存储。这个 功能包括:
- 文件的硬盘存储
- 索引的内存存储
- 直接映射和减少python中指定的函数
- 每个数据库有任意数量的视图
- 可以使用或不使用缩小视图来访问视图
- 线程安全(每个数据库有锁)
安装
您可以 pip (python 3)安装这个github存储库或标记,如下所示:
< Buff行情> $pip安装 https://github.com/eblade/jsondb/archive/0.2.tar.gz这也将安装blist,用于更快地获取视图。
示例
创建一个新数据库(如果从关系数据库的角度考虑,则为表):
>>>fromlindh.jsondbimportDatabase>>>db=Database('/tmp/cars')>>>db.clear()# for doctest purposes
这将创建一个文件夹 /tmp/cars ,用于存储 文档(json文件)和一个id计数器。
要用某些内容填充数据库,可以使用db.save(…)。 这些文档将自动被赋予唯一的id。如果你只是 要使用索引检索它们,这不是问题,但如果 要控制标识符,可以这样做:
>>>db[0]={'brand':'Volvo','model':'S40','wheels':6}>>>db[1]={'brand':'Mercedes','model':'C','wheels':8}>>>db[2]={'brand':'Volvo','model':'V70','wheels':4}>>>db[3]={'brand':'Honda','model':'CB500F','wheels':2}
这使您能够以预期的pythonic方式检索它们。
文档是同步存储的,因此您的应用程序可能会重新启动 无数据丢失。
让我们看一个交互式会话,了解文档 当它回来的时候:
>>>db[0]=={'wheels':6,'_id':0,'_rev':0,'brand':'Volvo','model':'S40'}True
如您所见,这个结构与couchdb的结构非常相似,使用 id 和 rev 字段。 \u rev 字段对于保持完整非常重要 as updated要求它是最新的(否则a lindh.jsondb.conflict 提高了)。要更新,很容易使用save(但是基于索引 设置也有效):
>>>db.save({'wheels':6,'_id':0,'_rev':0,'brand':'Volvo','model':'S40','color':'white'})== \ ...{'wheels':6,'_id':0,'_rev':1,'brand':'Volvo','model':'S40','color':'white'}True
这里应该更改 \u rev ,通常弹出一个数字(而 couchdb将为每个修订返回随机散列。
要删除文档,可以简单地使用del db[key]或 db.delete(键)
视图
没有索引的键值存储有什么乐趣?不多!
>>>db.define('by_wheels',lambdao:(o['wheels'],' '.join([o['brand'],o['model']])))>>>list(db.view('by_wheels'))[0]== \ ...{'id':3,'key':2,'value':'Honda CB500F'}True
所以我们定义了一个名为 by_wheels的视图 用作键,品牌和型号的连接用作 价值。风景总是有条理的,所以我知道摩托车会 先出来。其余的命令有些武断,因为 二进制搜索树用于将索引保存在内存中。
请注意,索引一创建就可用。这是 因为定义索引的操作是异步的。它确实 不管视图是在文档之前还是之后定义的 创建,因为文档将放在临时索引中。他们 也会被删除。这意味着,对于性能:
- 添加文档是o(log n)
- 查找文档是o(log n)
- 删除文档是o(log n)
因此,只要索引适合内存(即 但是,实际的文档不需要放在内存中。天生的 作为二进制搜索树,它总是按键排序。
现在,这带我们去分类。进一步模仿coucHDB,钥匙需要 可以在python的核心功能之外进行排序。任何需要的东西 基本上可以和任何东西相比。还有,我们需要一些东西 分别比其他东西小和大。这些是 无 和 任何
让我们重新访问 by_wheels 视图,并获取等于 或超过6个车轮(我知道这不是准确的数据)。
>>>list(db.view('by_wheels',startkey=6,endkey=any))== \ ...[{'id':0,'key':6,'value':'Volvo S40'},{'id':1,'key':8,'value':'Mercedes C'}]True
这里使用 list() 的原因是 发电机返回。
有关视图的详细信息
许多关键字参数可以传递给 视图(…) 方法:
- 键 指定单个键(可以给多个值0)
- startkey 指定包含的起始点。可以是元组。
- 结束键 指定并包含结束点。可以是元组。
- 包含文档 ,如果 为真 ,则呈现此索引的文档 post包含在 文档 下
- 组 ,如果 真 和a 减少 函数被指定为 define方法的第三个参数,结果将是 减少数据而不是映射。
如果有reduce函数,但您不想 这次使用,将其设置为 true 并将 组保留为 错误 - 跳过 ,整数偏移量(默认为 0 )
- 限制 ,整页大小(设置为 无限制 表示无限制)
有关reduce函数的更多信息,请参见couchdb 文档。最大的区别是:
- 不支持组级别。分组总是在最深的地方进行 级别(表示元组键中的所有元素)。
- 再减少就永远不会完成。但是。然而reduce函数期望 f(键、值、重排) 。这可能会导致缩放 但我还没有遇到问题。
进一步阅读
- lib主要是为images6项目开发的,可以在 https://github.com/eblade/images6 。这意味着它很有用 例子。例如,查看 images6/system.py 视图已设置。
- 此外,lib与它的妹妹lindh jsonobject一起工作得很好。 这是一个django启发的序列化/反序列化库 复杂的python对象和json。可以在这里找到: https://github.com/eblade/jsonobject
作者
lindh.jsondb 由johan egneblad编写和维护