MeuhDB,一个会说话的数据库
项目描述
这个数据库会说“Meuh”
MeuhDb 是一个用Python编写的“虚拟”键/JSON值存储。
安装
要安装最新版本
pip install meuhdb
…但是由于这是一个非常早期的版本,您最好坚持使用这个GitHub源代码仓库。您可能还想阅读变更日志。
基本用法
>>> from meuhdb import MeuhDb
>>> db = MeuhDb() # Create in-memory database
>>> db.set('one', {'name': 'Alice', 'good': True, 'chief': True})
>>> db.set('two', {'name': 'Bob', 'good': True})
>>> db.set('three', {'name': 'Carl', 'good': False})
>>> db.filter(name='Alice')
{'one': {'chief': True, 'good': True, 'name': 'Alice'}}
>>> db.filter(good=True)
{'two': {'good': True, 'name': 'Bob'}, 'one': {'chief': True, 'good': True, 'name': 'Alice'}}
>>> db.filter(good=True, chief=True) # More than one criteria, it's a "AND"
{'one': {'chief': True, 'good': True, 'name': 'Alice'}
>>> db.delete('one')
>>> db.filter(name='Alice')
{}
>>> db.exists('one')
False
>>> db.insert({'name': 'John'})
'eb3c3a1d-8999-4052-9e3c-2f3542c047b1'
>>> db.update('eb3c3a1d-8999-4052-9e3c-2f3542c047b1', {'age': 42})
>>> db.get('eb3c3a1d-8999-4052-9e3c-2f3542c047b1')
{'age': 42, 'name': 'John'}
目前,您只能查询“等式”,即您正在寻找的内容与JSON字段中的内容之间的严格相等(没有特殊操作符:大于、不同等)。
值必须是JSON可序列化值(字典,不适用于日期、datetime、集合等)。
数据库创建
在 MeuhDb 类构造函数中有几个可选参数
MeuhDb(
path=None,
autocommit=False, autocommit_after=None,
lazy_indexes=False,
backend=DEFAULT_BACKEND)
path:如果您想将JSON数据库保存到文件中,则是文件路径。如果文件已存在,MeuhDb 将尝试加载数据。如果没有提供,则数据库将在内存中。
autocommit:如果设置为 True,则每个“写入”操作都将传输到文件。由于每次都要将整个数据库写入磁盘,因此可能会消耗I/O资源。
autocommit_after:一个数值。如果设置,则数据库将在“n”次写入操作后提交。请注意,如果设置了 autocommit 标志,则它具有比计数器更高的优先级。
lazy_indexes:当设置为True时,数据库写入数据库时,只存储索引的定义,而不是索引值本身。这意味着数据库在写入时间上更快,但加载速度会变慢,因为我们需要重建所有索引。
backend:选择可以使用的JSON后端。有3个可能的后端,从最不高效的到最好的: “json”(来自标准库)、“simplejson”、“jsonlib”、“yajl”或“ujson”。MeuhDb将尝试加载它们中的每一个,并在需要时使它们可用。如果提供了不可用的后端,请不要担心,MeuhDb将回退到标准库中的舒适《json》。
示例
>>> db = MeuhDb('hello.json', autocommit=False, backend='ujson')
>>> db.set('1', {'name': 'Alice'}) # data is not on disk
>>> db.commit() # saves to disk
>>> db = MeuhDb('hello.json', autocommit=True)
>>> db.all() # Data is reloaded from the disk
{u'1': {u'name': u'Alice'}}
>>> db.set('2', {'name': 'Bob'}) # data is written on disk
索引
MeuhDb支持索引创建。您可以为加速查询索引一个或多个字段。
示例
>>> db.create_index('name')
>>> db.filter(name='Alice') # Will use this index
您不必索引JSON值中所有可用的字段,只需索引您可能查询的字段。
索引将与数据库一起在commit()时保存。
如果索引出了问题,只需使用recreate参数重新创建它:db.create_index('name', recreate=True)。
索引类型
您可以使用此方法指定索引类型
db.create_index('name', _type='lazy')
您只能创建两种类型的索引: default或lazy。延迟索引在数据库提交时不会存储,将在启动时重新加载。您可以混合默认和延迟索引。
注意:由于所有JSON键应该是字符串,因此显然无法存储具有非字符串值的索引。一旦索引收到非字符串值(例如整数或布尔值),它将更改为延迟索引。
警告
这不是一个真正的ACID就绪数据库管理器。这可能适合“仅限一个用户”的使用情况。打开和加载大文件非常消耗I/O。因此,MeuhDb 永远不会取代适当的NoSQL数据库系统。
黑客
MeuhDb将与标准的Python 2发行版一起工作。(我有计划使其准备好Python-3)
在虚拟环境中,只需克隆此存储库并在开发模式下安装它
git clone https://github.com/brunobord/meuhdb.git cd meuhdb pip install -e ./
您可能需要安装这些包中的一个或多个,以便能够选择这些增强后端之一
simplejson,
jsonlib(或jsonlib-python3),
yajl,
ujson
要运行测试,您必须安装tox(pip install tox)并简单地运行命令tox。
待办事项
有很多东西缺失。Github问题列表将充当“待办事项列表”。如果您有任何错误报告或建议,请提出。
许可
本软件根据MIT许可证发布。有关更多信息,请参阅LICENSE文件。