跳转到主要内容

Sophia数据库的Python绑定。

项目描述

Sophia Library Latest Version https://img.shields.io/pypi/wheel/sonya.svg https://img.shields.io/pypi/pyversions/sonya.svg https://img.shields.io/pypi/l/sonya.svg

Sonya

sonya,Sophia嵌入式数据库(v2.2)的快速Python绑定。

关于sonya

  • 用Cython编写以提高速度和降低开销

  • 简洁、易于记忆的API

  • 广泛支持Sophia的功能

  • 支持Python 2 Python 3

  • 除了Cython(对于python>3)之外,没有第三方依赖项

关于Sophia

Sophia Library
  • 文档存储

  • ACID事务

  • MVCC,乐观的,非阻塞的并发,具有多个读取器和写入器。

  • 每个环境多个数据库

  • 跨数据库的多条语句事务

  • 前缀搜索

  • 自动垃圾回收

  • 热备份

  • 压缩

  • 多线程压缩

  • mmap支持,直接I/O支持

  • API用于存储引擎内部的各种统计信息

  • BSD许可

Sophia可能适合的一些场景

  • 运行在应用程序服务器上,低延迟/高吞吐量

  • 时间序列

  • 分析/事件/日志

  • 全文搜索

  • 外部数据存储的二级索引

限制

  • 未在Windows上测试。

如果您在库中遇到任何错误,请创建一个问题,包括错误的描述和相关的跟踪信息。

安装

《a href="http://sophia.systems" rel="nofollow">sophia》源代码与《cite>sonya》源代码捆绑在一起,因此您只需安装Cython。您可以从GitHubPyPi安装。

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

运行测试

$ pip install pytest
$ pytest tests

概述

除了常规的字典操作外,Sonya 还可以高效地使用游标读取返回的数据切片。类似地,使用 update() 进行的大批量写入操作也是高效的、原子的批量操作。

尽管 API 简单,Sophia 还是拥有很多高级功能。本文件无法涵盖所有内容,因此请务必查阅官方的 Sophia 存储引擎文档

下一节将展示如何使用 sonya 执行常见操作。

使用 Sonya

首先导入 sonya 并创建一个环境。该环境可以托管多个数据库,每个数据库可能具有不同的模式。在本例中,我们的数据库将存储作为键和值的 Python 对象。最后,我们将打开环境,以便开始存储和检索数据。

from sonya import Environment, fields, Schema


class DictSchema(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 document
db.set(document)

print(db.get(key='foo'))
# {'value': [1, 2, 3, 'bar'], 'key': 'foo'}

CRUD 操作

Sonya

from sonya import Environment, fields, Schema


class DictSchema(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 document
db.set(document)

# Read document
document = db.get(key='foo')

# Update the document
document = db.document(key='foo', value=None)
db.set(document)

# Delete the document
document = db.document(key='foo', value=None)
db.delete(key='foo')

# Iterate through the database
for document in db.cursor():
   print(document)

# Delete multiple documents
# fastest method for remove multiple documents from database
db.delete_many(order='>=')

获取范围(游标)

由于 Sophia 是有序数据存储,执行有序范围扫描是高效的。要检索一系列键值对,可以使用 Sonya 字典查找的 slice

为了更精细地控制迭代或进行前缀匹配,Sonya 提供了游标接口。

cursor() 方法接受特殊的键参数 order 和所有键字段

  • order(默认为`>=`)- 匹配起始键和排序结果的语义。

from sonya import Environment, fields, Schema


class IntSchema(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()


with db.transaction() as tx:
    for i in range(10000):
        tx.set(db.document(key=i, value=None))

# Iterate through the database
for document in db.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}

对于前缀搜索,使用键的一部分进行排序

from sonya import Environment, fields, Schema


class StringSchema(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()


with db.transaction() as tx:
    for i in range(10000):
        tx.set(db.document(key=str(i), value=None))

# Iterate through the database
for document in db.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 提供了 delete_many 方法。当您想从数据库中删除多个文档时,这是最快的选择。该方法具有类似于游标的接口。整个操作将在一个事务中完成。

该方法返回受影响的行数。

from sonya import Environment, fields, Schema


class IntSchema(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()


with db.transaction() as tx:
    for i in range(10000):
        tx.set(db.document(key=i, value=None))

# returns the number of affected rows
db.delete_many(order='>=', key=9995):

文档计数

数据库对象具有 __len__ 方法。请避免在大型数据库中使用它,因为它每次都会迭代并计算文档数量(比使用 len(list(db.cursor())) 快,但仍然具有 O(n) 复杂度)。

from sonya import Environment, fields, Schema


class IntSchema(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()


with db.transaction() as tx:
    for i in range(10000):
        tx.set(db.document(key=i, value=None))

print(len(db))
# 10000

事务

Sophia 支持 ACID 事务。更好的是,单个事务可以覆盖给定环境中多个数据库的操作。

示例用法

class Users(Schema):
    name = fields.StringField(index=0)
    surname = fields.StringField(index=1)
    age = fields.UInt8Field()


with users.transaction() as tx:
    tx.set(users.document(name='Jane', surname='Doe', age=19))
    tx.set(users.document(name='John', surname='Doe', age=18))

    # Raises LookupError
    db.get(name='John', surname='Doe')

同时可以打开多个事务,但如果存在冲突更改,在尝试提交有问题的交易时将抛出异常。

配置和管理 Sophia

Sophia 可以通过 SophiaDatabase 对象的特殊属性进行配置。有关可用选项的详细信息(包括它们是否为只读,以及预期的数据类型),请参阅配置文档

例如,要查询 Sophia 的状态,可以使用 status 属性,这是一个只读设置,返回一个字符串

>>> print(env['sophia.status'])
"online"

可以通过将新值分配给属性来更改其他属性。例如,要读取并增加调度器使用的线程数

>>> env['scheduler.threads'] = env['scheduler.threads'] + 2
>>> env.open()
>>> print(env['scheduler.threads'])
8
>>> print(dict(env))
{'db.test-string-db.stat.cursor_latency': '0 0 0.0', ...}

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

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

sonya-0.6.6.tar.gz (290.2 kB 查看哈希)

上传于 源代码

构建的版本

sonya-0.6.6-cp36-cp36m-manylinux1_x86_64.whl (1.3 MB 查看哈希值)

上传于 CPython 3.6m

sonya-0.6.6-cp36-cp36m-macosx_10_6_intel.whl (862.0 kB 查看哈希值)

上传于 CPython 3.6m macOS 10.6+ intel

sonya-0.6.6-cp36-cp36m-linux_armv7l.whl (1.2 MB 查看哈希值)

上传于 CPython 3.6m

sonya-0.6.6-cp35-cp35m-manylinux1_x86_64.whl (1.3 MB 查看哈希值)

上传于 CPython 3.5m

sonya-0.6.6-cp35-cp35m-macosx_10_6_intel.whl (1.5 MB 查看哈希值)

上传于 CPython 3.5m macOS 10.6+ intel

sonya-0.6.6-cp34-cp34m-manylinux1_x86_64.whl (1.3 MB 查看哈希值)

上传于 CPython 3.4m

sonya-0.6.6-cp34-cp34m-macosx_10_6_intel.whl (1.5 MB 查看哈希值)

上传于 CPython 3.4m macOS 10.6+ intel

sonya-0.6.6-cp27-cp27m-manylinux1_x86_64.whl (1.2 MB 查看哈希值)

上传于 CPython 2.7m

支持者