Sophia数据库的Python绑定。

sonya的Python项目详细描述


索尼娅

sonya ,Sophia嵌入式数据库的快速Python绑定

关于索尼娅:

  • 以cython编写,以提高速度和降低开销
  • 干净、令人难忘的API
  • 广泛支持Sophia的功能
  • python 2 python 3支持
  • 除了cython(对于python>;3),没有第三方依赖项

关于索菲亚:

sophia library
  • 文档存储
  • 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

有关设置的完整列表,请参阅 文档 。 虚线路径转换为下划线分隔的属性。

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

推荐PyPI第三方库


热门话题
c#Java Tcp服务器和。Net Tcp客户端的发送和接收问题   安卓应用程序上的java标记地理位置,其位置位于我周围5Km半径范围内。   向java添加对话框并检索html文件   当eclipse甚至无法打开时,java会在eclipse中更改不兼容的JVM   java中同一jframe中的jlabel和paintComponent   基于另一数组排序的java排序   java AADSTS7000012:该补助金是为另一个租户获得的   java在JSF中使用foreach循环   java如何通过maven为运行junit测试创建运行配置?   java Selenium webDriver不稳定错误堆栈跟踪   java有没有办法创建以键为大写的JSON对象?