Sophia数据库的Python绑定。
sonya的Python项目详细描述
索尼娅
sonya ,Sophia嵌入式数据库的快速Python绑定
关于索尼娅:
- 以cython编写,以提高速度和降低开销
- 干净、令人难忘的API
- 广泛支持Sophia的功能
- python 2 和 python 3支持
- 除了cython(对于python>;3),没有第三方依赖项
关于索菲亚:
- 文档存储
- ACID事务
- MVCC,乐观,无阻塞并发,具有多个读写器。
- 每个环境有多个数据库
- 跨数据库的多对账单和单对账单交易
- 前缀搜索
- 自动垃圾收集
- 热备份
- 压缩
- 多线程压缩
- mmap 支持,直接I/O支持
- 用于存储引擎内部各种统计信息的api
- BSD许可
关于索菲亚适合哪里的一些想法:
- 在应用服务器上运行,低延迟/高吞吐量
- 时间序列
- 分析/事件/日志记录
- 全文搜索
- 外部数据存储的辅助索引
限制:
- 未在Windows上测试。
如果您在库中遇到任何错误,请打开问题, 包括对错误的描述和任何相关的回溯。
安装
sophia的源代码与sonya的源代码捆绑在一起。 代码,所以您只需要安装cython。 您可以从 github 或 pypi 安装。
PIP说明:
$ pip install Cython # Optional
$ pip install sonya
或者安装master的最新代码:
$ pip install Cython # Required $ pip install git+https://github.com/mosquito/sonya#egg=sonya
Git说明:
$ pip install Cython
$ git clone https://github.com/mosquito/sonya
$ cd sonya
$ python setup.py build
$ python setup.py install
运行测试:
$pipinstallpytest$pytesttests
概述<索尼娅> 除了正常的字典操作之外,您还可以读取 使用游标有效返回。类似地,使用 update() use进行批量写入 高效的原子批处理操作。
尽管有简单的api,sophia还是有很多高级特性。也有 本文件涵盖了所有内容,请务必查看 Sophia存储引擎文档
下一节将展示如何使用sonya执行常见操作。
使用Sonya
让我们从导入sonya和创建环境开始。环境 可以承载多个数据库,每个数据库可能具有不同的架构。在这 示例我们的数据库将python对象存储为键和值。 最后,我们将打开环境,以便开始存储和检索数据。
fromsonyaimportEnvironment,fields,SchemaclassDictSchema(Schema):key=fields.PickleField(index=0)value=fields.PickleField()env=Environment('/tmp/test-env')db=env.database('test-database',DictSchema(),compression='zstd')env.open()document=db.document(key='foo',value=[1,2,3,'bar'])# Insert a documentdb.set(document)print(db.get(key='foo'))# {'value': [1, 2, 3, 'bar'], 'key': 'foo'}
积垢操作
<>索尼娅fromsonyaimportEnvironment,fields,SchemaclassDictSchema(Schema):key=fields.PickleField(index=0)value=fields.PickleField()env=Environment('/tmp/test-env')db=env.database('test-database',DictSchema(),compression='zstd')env.open()document=db.document(key='foo',value=[1,2,3,'bar'])# Create a documentdb.set(document)# Read documentdocument=db.get(key='foo')# Update the documentdocument=db.document(key='foo',value=None)db.set(document)# Delete the documentdocument=db.document(key='foo',value=None)db.delete(key='foo')# Iterate through the databasefordocumentindb.cursor():print(document)# Delete multiple documents# fastest method for remove multiple documents from databasedb.delete_many(order='>=')
获取范围(游标)
因为sophia是有序数据存储,所以执行有序范围扫描是 效率高。使用sonya检索一系列键值对 使用 片段来查找字典。
为了更细粒度地控制迭代,或者进行前缀匹配,sonya 提供光标界面。
方法接受特殊的关键字参数 关键字段:
- 顺序 (默认值=`>;=`)–匹配开始键和顺序的语义 结果。
fromsonyaimportEnvironment,fields,SchemaclassIntSchema(Schema):key=fields.UInt32Field(index=0)value=fields.PickleField()env=Environment('/tmp/test-env')db=env.database('test-integer-db',IntSchema(),compression='zstd')env.open()withdb.transaction()astx:foriinrange(10000):tx.set(db.document(key=i,value=None))# Iterate through the databasefordocumentindb.cursor(order='>=',key=9995):print(document)# {'key': 9995, 'value': None}# {'key': 9996, 'value': None}# {'key': 9997, 'value': None}# {'key': 9998, 'value': None}# {'key': 9999, 'value': None}
对于前缀搜索,请使用部分键和顺序:
fromsonyaimportEnvironment,fields,SchemaclassStringSchema(Schema):key=fields.StringField(index=0)value=fields.PickleField()env=Environment('/tmp/test-env')db=env.database('test-string-db',IntSchema(),compression='zstd')env.open()withdb.transaction()astx:foriinrange(10000):tx.set(db.document(key=str(i),value=None))# Iterate through the databasefordocumentindb.cursor(order='>=',key='999'):print(document)# {'value': None, 'key': '999'}# {'value': None, 'key': '9990'}# {'value': None, 'key': '9991'}# {'value': None, 'key': '9992'}# {'value': None, 'key': '9993'}# {'value': None, 'key': '9994'}# {'value': None, 'key': '9995'}# {'value': None, 'key': '9996'}# {'value': None, 'key': '9997'}# {'value': None, 'key': '9998'}# {'value': None, 'key': '9999'}
删除多个文档
Sonya提供了许多删除方法。当 要从数据库中删除多个文档。方法 具有类似光标的界面。整个操作将被处理 在一次交易中。
该方法返回受影响的行数。
fromsonyaimportEnvironment,fields,SchemaclassIntSchema(Schema):key=fields.UInt32Field(index=0)value=fields.PickleField()env=Environment('/tmp/test-env')db=env.database('test-integer-db',IntSchema(),compression='zstd')env.open()withdb.transaction()astx:foriinrange(10000):tx.set(db.document(key=i,value=None))# returns the number of affected rowsdb.delete_many(order='>=',key=9995):
文档计数
数据库对象有一个 \uu len\uu 方法。请避免使用 对于任何大型数据库,它每次都迭代并计数文档 (比使用len(list(db.cursor())更快)但是仍然有o(n)复杂性。
$ pip install Cython # Optional
$ pip install sonya
0
交易
Sophia支持ACID事务。更妙的是,一笔交易可以覆盖 在给定环境中对多个数据库的操作。
示例用法:
$ pip install Cython # Optional
$ pip install sonya
1
允许同时打开多个事务,但如果 如果更改发生冲突,则在尝试提交 违规交易。
配置和管理Sophia
Sophia可以使用 Sophia 上的特殊属性进行配置,并且 数据库 对象。有关详细信息,请参阅配置文档 关于可用选项,包括它们是否为只读,以及 需要数据类型。
例如,要查询sophia的状态,可以使用 status 属性,该属性 是返回字符串的只读设置:
$ pip install Cython # Optional
$ pip install sonya
2
其他属性可以通过为该属性分配新值来更改。为了 例如,要读取并增加调度程序使用的线程数:
$ pip install Cython # Optional
$ pip install sonya
3
有关设置的完整列表,请参阅 文档 。 虚线路径转换为下划线分隔的属性。