Skip to main content

sophia 数据库的 Python 绑定。

项目描述

索菲亚图书馆 最新版本 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 ,用于Sophia 嵌入式数据库的快速 Python 绑定,v2.2。

关于索尼娅:

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

  • 干净、令人难忘的 API

  • 对 Sophia 功能的广泛支持

  • Python 2Python 3 支持

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

关于索菲亚:

索菲亚图书馆
  • 文档存储

  • ACID 事务

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

  • 每个环境多个数据库

  • 跨数据库的多语句和单语句事务

  • 前缀搜索

  • 自动垃圾收集

  • 热备份

  • 压缩

  • 多线程压缩

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

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

  • BSD 许可

关于 Sophia 可能适合哪些地方的一些想法:

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

  • 时间序列

  • 分析/事件/记录

  • 全文搜索

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

限制:

  • 未在 Windows 上测试。

如果您在库中遇到任何错误,请打开一个问题,包括错误的描述和任何相关的回溯。

安装

sophia源代码与sonya源代码捆绑在一起,因此您唯一需要安装的是Cython。您可以从GitHub或从PyPi安装。

点子说明:

$ 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执行常见操作。

使用索尼娅

让我们从 import 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 操作

索尼娅

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 字典查找来检索一系列键值对。

为了对迭代进行更细粒度的控制,或者进行前缀匹配,Sonya 提供了一个光标接口。

cursor()方法接受特殊的关键字参数顺序和所有关键字段:

  • order (default=`>=`) - 匹配开始键和排序结果的语义。

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 查看哈希)

已上传 source

内置发行版

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

已上传 cp36

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

已上传 cp36

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

已上传 cp36

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

已上传 cp35

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

已上传 cp35

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

已上传 cp34

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

已上传 cp34

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

已上传 cp27