Skip to main content

用于 MongoDB 的轻量级 Pythonic OR Mapper。

项目描述

MongoBase 徽标

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

已上传 source

内置分布

mongobase-0.3.1a0-py3-none-any.whl (14.5 kB 查看哈希

已上传 py3