python的封装持久层
polydatum的Python项目详细描述
python封装的持久层,用于支持许多数据访问层。
更改日志
0.9.0
- 增加了对Python3.6+的支持
0.8.4
- 添加了上下文中间件
- 为上下文添加了只读元
- 删除localproxy magic以便更容易与其他框架集成的第一步
- 使您可以对资源使用简单的生成器函数
- 简化了对dataaccesscontext的异常处理,以便只在context或中间件中引发异常。资源退出异常被抑制。
错误修复
- 修正了一个防止使用资源的错误:
部件
数据管理器
数据管理器是polydatam的中心对象。它是 服务、资源和中间件。通常应用程序有一个数据管理器 每个进程。数据管理器还管理上下文并提供对dal的访问。
上下文
上下文包含活动请求的当前状态。它还提供 获得资源。在http框架中使用时,通常一个上下文是 在http请求开始时创建,在http响应之前结束 已发送。
当与任务管理器(如芹菜)一起使用时,将在 任务开始并在返回任务结果之前结束。
dal
DAL是“数据访问层”。DAL是所有服务的注册中心。 要对服务调用方法,可以从dal开始。
result = dal.someservice.somemethod()
服务
服务封装了业务逻辑和数据访问。他们是 类似mvc的应用程序。服务可以嵌套在其他服务中。
dal.register_services( someservice=SomeService().register_services( subservice=SubService() ) ) result = dal.someservice.subservice.somemethod()
meta
meta是关于上下文的数据,通常包括活动的 用户或http请求。meta是只读的,不能在 上下文。
class UserService(Service): def get_user(self): return self._ctx.meta.user dm = DataManager() dm.register_services(users=UserService()) with dm.context(meta={'user': 'bob'}) as ctx: assert ctx.dal.test.get_user() == 'bob'
资源
资源是按需访问数据后端的,如sql数据库、key 商店和Blob商店。资源有一个设置和拆卸阶段。资源 只在第一次在上下文中访问时初始化和设置。 这种延迟加载确保了 特定请求已初始化。
安装/拆卸阶段特别适合检查连接 从连接池中,并在请求结束时将其签入。
def db_pool(context): conn = db.checkout_connection() yield conn db.checkin_connection(conn) class ItemService(Service): def get_item(self, id): return self._data_manager.db.query( 'SELECT * FROM table WHERE id={id}', id=id ) dm = DataManager() dm.register_services(items=ItemService()) dm.register_resources(db=db_pool) with dm.dal() as dal: item = dal.items.get_item(1)
中间件
中间件对每个上下文都有一个设置和拆卸阶段。他们是 对于管理事务或错误处理特别有用。
上下文中间件只能查看和修改上下文。与 上下文,上下文中间件可以访问资源。
def transaction_middleware(context): trans = context.db_resource.new_transaction() trans.start() try: yield trans except: trans.abort() else: trans.commit() dm = DataManager() dm.register_context_middleware(transaction_middleware)
原理
- 如果找不到对象,则获取对象的方法应返回none。
- 所有数据访问(sql、mongodb、redis、s3等)都必须在服务中完成。
注意事项
中间件与资源
按需创建资源。其目的是创建所需的资源
请求并在完成后进行清理。它是在上下文中创建的(并且可能
通过中间件)。资源拆卸期间发生的错误将被抑制。
中间件在每个上下文上运行。它是在上下文是活动的并且
在资源枯竭之前。其目的是在
上下文。上下文中发生的错误会传播到中间件。错误
在中间件中发生也会传播。
测试
要运行测试,您需要安装测试要求:
pip install -e .
pip install -r src/tests/requirements.txt
运行测试:
cd src/tests && py.test
测试
要运行测试,您需要安装测试要求:
pip install -e . pip install -r src/tests/requirements.txt
运行测试:
cd src/tests && py.test