用于 MongoDB 的轻量级 Pythonic OR Mapper。
项目描述
MongoBase 是一个提供高级功能的 Python 包:
- 用于 MongoDB 的轻量级 OR 映射器 (ORM)
- 具有自动类型检查的简单数据库模型结构定义
- 从多个键生成高级自动文本搜索索引
依赖项
- pymongo_ 3.7+
更多关于 MongoBase
零件 | 描述 |
---|---|
mongobase | 与来自 ModelBase 的模型定义系统和许多数据库操作的高级接口 |
模型库 | 根据定义的结构(MongoBase 子类)进行自动类型检查的 OR Mapper 类 |
MongoBase 的理念是
- 能够在 python 上轻松且安全地以编程方式使用 MongoDB
- 只需快速查看模型定义,即可清晰查看有关数据模型的所有内容
- 易于学习如何使用。例如,方法名称对应于 MongoDB,以便能够像在 mongoclient 上一样使用它们。
- 高性能。它使用最新的连接池机制,以便有效地使用客户端对象
基本接口
模型定义
这是模型的示例定义。
class Bird(MongoBase):
__collection__ = 'birds'
__structure__ = {
'_id': ObjectId,
'name': str,
'age': int,
'is_able_to_fly': bool,
'created': dt.datetime,
'updated': dt.datetime
}
__required_fields__ = ['_id', 'name']
__default_values__ = {
'_id': ObjectId(),
'is_able_to_fly': False,
'created': dt.datetime.now(dt.timezone.utc),
'updated': dt.datetime.now(dt.timezone.utc)
}
__validators__ = {
'name': validate_length(0, 1000),
}
__search_text_keys__ = ['name']
__search_text_index_type__ = 'bigram'
__indexes__ = [
[('item_name', ASCENDING),],
]
核心模型结构__structure__
由字典定义。可以清楚地了解文档结构如何。模型定义的其他组件是:
零件 | 描述 |
---|---|
__collection__ |
文档的集合名称。(必需的) |
__structure__ |
模型的核心定义。每次写入数据库时都会自动检查类型。密钥_id 是必需的。(必需的) |
__required_fields__ |
所需的属性。(可选的) |
__default_values__ |
设置属性的默认值。(可选的) |
__validators__ |
当文档写入数据库时,验证器方法会自动检查值。(可选的) |
__search_text_keys__ |
可以为搜索文本索引设置多个键。自动写入search_text 属性。(可选的) |
__search_text_index_type__ |
bigram : 的值search_text 设置为二元字符串。morpheme : 中的字符串search_text 被解析为语素(可选) |
__search_text_weight_type__ |
uniform :每个字符串具有相同的权重。weighted :启用将权重设置为[('key1', 3), ('key2', 1)] (可选) |
__indexes__ |
可以设置索引。.createIndex() 方法在数据库上创建索引。(可选的) |
现在介绍基本用法。
插入和更新
>> chicken = Bird({'_id': ObjectId(), 'name': 'chicken', 'age': 3})
>> chicken.save()
{'_id': ObjectId('5c80f4fa16fa0d6c102cd2a6'),
'name': 'chicken',
'age': 3,
'is_able_to_fly': False,
'created': datetime.datetime(2019, 3, 7, 10, 39, 54, 643685, tzinfo=datetime.timezone.utc),
'updated': datetime.datetime(2019, 3, 7, 10, 39, 54, 643690, tzinfo=datetime.timezone.utc)}
>> chicken.is_able_to_fly = True
>> chicken.update()
寻找
>>> Bird.findOne({'name': 'mother chicken'})
{'_id': ObjectId('5c79166716fa0d215968d3ba'),
'name': 'mother chicken',
'age': 63,
'is_able_to_fly': False,
'created': datetime.datetime(2019, 3, 1, 11, 20, 21, 306000),
'updated': datetime.datetime(2019, 3, 1, 11, 20, 21, 306000)}
>>> mother_chicken.remove()
1
>>> all_chickens = Bird.find({'name': 'chicken'}, sort=[('_id', ASCENDING)])
list of mongobase instances are returned.
>>> len(all_chickens)
18
>>> Bird.count()
201
批量操作
- 批量插入
>>> many_pigeon = []
>>> for i in range(10000):
>>> many_pigeon += [Bird({'_id': ObjectId(), 'name': f'pigeon', 'age': i})]
>>> Bird.bulk_insert(many_pigeon)
10000
- 批量更新
>>> updates = []
>>> for pigeon in many_pigeon:
>>> pigeon.age *= 3
>>> updates += [pigeon]
>>> Bird.bulk_update(updates)
10000
上下文数据库
with db_context(db_uri='localhost', db_name='test') as db:
flamingo = Bird({'_id': ObjectId(), 'name': 'flamingo', 'age': 20})
flamingo.save(db=db)
flamingo.age = 23
flamingo = flamingo.update(db=db)
flamingo = Bird.findAndUpdateById(flamingo._id, {'age': 24}, db=db)
n_flamingo = Bird.count({'name': 'flamingo'}, db=db)
Bird.count({'name': 'flamingo'})
多重处理
def breed(tasks):
db = Bird._db() # create a MongoDB Client for the forked process
for i in range(len(tasks)):
sparrow = Bird({'_id': ObjectId(), 'name': f'sparrow', 'age': 0})
sparrow.save(db=db)
tasks = [[f'task {i}' for i in range(N_BATCH)] for j in range(N_PROCESS)
process_pool = multiprocessing.Pool(N_PROCESS)
process_pool.map(breed, tasks)
MongoBase 还有许多其他功能
如果您想了解其他功能,请查看文件 mongobase.py。
数据库设置
只需写入 mongobase/config.py
MONGO_DB_URI = "101.21.434.121"
MONGO_DB_URI_TEST = "localhost"
MONGO_DB_NAME = "zoo"
MONGO_DB_NAME_TEST = "zoo-test"
MONGO_DB_CONNECT_TIMEOUT_MS = 3000
MONGO_DB_SERVER_SELECTION_TIMEOUT_MS = 3000
MONGO_DB_SOCKET_TIMEOUT_MS = 300000
MONGO_DB_SOCKET_KEEP_ALIVE = True
MONGO_DB_MAX_IDLE_TIME_MS = 40000
MONGO_DB_MAX_POOL_SIZE = 200
MONGO_DB_MIN_POOL_SIZE = 10
MONGO_DB_WAIT_QUEUE_MULTIPLE = 12
MONGO_DB_WAIT_QUEUE_TIMEOUT_MS = 100
入门
如果你启动 MongoBase,这里有一个教程 jupyter notebook。
强烈建议检查一下。
https://github.com/kazukiotsuka/mongobase/blob/master/tutorial/MongoBase_starting_guide.ipynb
发布和贡献
很多方法都是pymongo的封装。
这个库涵盖了很多功能。
如果您随时添加他们的方法,将不胜感激。
版本 0.3.0
新的功能
- 批量插入()
- 批量更新()
- 使用 ConnectionPool 提高性能(每个进程使用单个 MongoClient)
- MongoBase_start_guide.ipynb
- 上下文数据库客户端模式
with db_context() as db
- 代码效率提升
- 取消
insert_if_not_exists
参数为save(), update()
- 更改了一些方法名称(例如删除 -> 删除)
- 使用 pymongo > 3.5 方法(例如 insert_one())
- 增强文档
版本 0.2.0
新的功能
- MongoBase 和 ModelBase 类是分开的
- 启用动态使用 MongoClient 实例
- 添加了一些有用的mongodb操作
版本 0.1.0
新的功能
- 初步实施
- 自动类型检查机制
- 基本的mongodb操作
执照
MongoBase 是 MIT 风格的许可,如 LICENSE 文件中所示。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
mongobase-0.3.1a0.tar.gz
(15.3 kB
查看哈希)
内置分布
mongobase-0.3.1a0-py3-none-any.whl
(14.5 kB
查看哈希)