基于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(键、值、重排) 。这可能会导致缩放 但我还没有遇到问题。

进一步阅读

作者

lindh.jsondb 由johan egneblad编写和维护

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

推荐PyPI第三方库


热门话题
swing如何在Java中从文本字段中删除逗号   java事务未激活异常EJB事务状态   在不打印新行的情况下更新java控制台   spring boot使用Java通过HTTP流式传输数据   java Right XPath语法,用于通过ID获取两种类型元素的节点列表   使用非明文密码的安全Java LDAP身份验证   java如何删除字符串中的字符,并将其用于另一个字符串   java使用Sikuli导出应用程序   java查找字符串以动态寻址串行端口   我对Java Mysql 8.0中的prepared语句有一个问题   JavaMail监视新消息   为什么列出pksc11tool七个对象,而Java密钥库只有一个   未报告的java异常。木卫一。IOException   java Spring Boot+Hibernate,使用@RequestBody对POST请求进行不正确的解析   java无法在配置单元中实例化错误   testcase成功后未生成java Serenity Bdd报告(在Eclipse和Jenkins中)