Sophia数据库的Python绑定。
项目描述
Sonya
sonya,Sophia嵌入式数据库(v2.2)的快速Python绑定。
关于sonya
用Cython编写以提高速度和降低开销
简洁、易于记忆的API
广泛支持Sophia的功能
支持Python 2 和 Python 3
除了Cython(对于python>3)之外,没有第三方依赖项
关于Sophia
文档存储
ACID事务
MVCC,乐观的,非阻塞的并发,具有多个读取器和写入器。
每个环境多个数据库
跨数据库的多条语句事务
前缀搜索
自动垃圾回收
热备份
压缩
多线程压缩
mmap支持,直接I/O支持
API用于存储引擎内部的各种统计信息
BSD许可
Sophia可能适合的一些场景
运行在应用程序服务器上,低延迟/高吞吐量
时间序列
分析/事件/日志
全文搜索
外部数据存储的二级索引
限制
未在Windows上测试。
如果您在库中遇到任何错误,请创建一个问题,包括错误的描述和相关的跟踪信息。
安装
《a href="http://sophia.systems" rel="nofollow">sophia》源代码与《cite>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
运行测试
$ 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 可以通过 Sophia 和 Database 对象的特殊属性进行配置。有关可用选项的详细信息(包括它们是否为只读,以及预期的数据类型),请参阅配置文档。
例如,要查询 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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5d2ec6c92a3d65de3826d5f6a53fc78060f70136c4ce857c823277a25fc06802 |
|
MD5 | 6b4c3243bc1f61b3973c168f087a56cf |
|
BLAKE2b-256 | ecd7252af8f0d26dbb5808c06bbced9b2a427939a2633e0764757cc8d599ea65 |
sonya-0.6.6-cp36-cp36m-manylinux1_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c308c60ec59c68d89dc9755ae018d52c308cabde7fb44a2d67210c483b54c6c2 |
|
MD5 | 0a542165ae871bcd33751ca70085b9c6 |
|
BLAKE2b-256 | ad4d5ccfa4c07269681d2876b329a4ad16f3e02b8b62a2b6557e8bc07220dd96 |
sonya-0.6.6-cp36-cp36m-macosx_10_6_intel.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e4e7e49a6620f5dbe9763506dc5fb17b5a9784111af47d29f5b2748a629fca97 |
|
MD5 | 8785b5c12973667ac48339edc54f40b2 |
|
BLAKE2b-256 | f533494f9c2356ddf66a9fac68cfc6f7c230aefd092c9f268ccc3595cffe55c6 |
sonya-0.6.6-cp36-cp36m-linux_armv7l.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7db6875991d2aae073b6597cc13ce1febbb3ef72d84110f02f6c4cad17ab6c01 |
|
MD5 | 52c52ba9150c034cbd89a2eb64da7c6f |
|
BLAKE2b-256 | efcc3eb1365092a7a2641b96cd2ac3e59b835e741fedc77a7fd1ade6627cbd1d |