sophia 数据库的 Python 绑定。
项目描述
索尼娅
sonya ,用于Sophia 嵌入式数据库的快速 Python 绑定,v2.2。
关于索尼娅:
用 Cython 编写以提高速度和低开销
干净、令人难忘的 API
对 Sophia 功能的广泛支持
Python 2和Python 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 可以使用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', ...}
有关设置的完整列表,请参阅文档。虚线路径被转换为下划线分隔的属性。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。