python的封装持久层

polydatum的Python项目详细描述


Build Status

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
  • 依赖于工作对象存在的方法(如 CREATE/) 在父对象上,如果父对象不存在,则应该引发 NoDebug
  • 所有数据访问(sql、mongodb、redis、s3等)都必须在服务中完成。

注意事项

中间件与资源

按需创建资源。其目的是创建所需的资源 请求并在完成后进行清理。它是在上下文中创建的(并且可能 通过中间件)。资源拆卸期间发生的错误将被抑制。

中间件在每个上下文上运行。它是在上下文是活动的并且 在资源枯竭之前。其目的是在 上下文。上下文中发生的错误会传播到中间件。错误 在中间件中发生也会传播。

测试

要运行测试,您需要安装测试要求:

pip install -e . pip install -r src/tests/requirements.txt

运行测试:

cd src/tests && py.test

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java能否使用OpenJPA将一个实体持久化到多个持久化单元?   java如何访问当前按下的键   java singleton是否意味着哈希代码总是返回相同的值?   inputstream无法在Java中同时使用STDIN和STDERR读取程序输出   java运行时有多贵。getRuntime()与获取内存度量相结合   java AndroidStudio ListView适配器更新   java小程序请求未扩展实时会话   java是设置布尔值所必需的关键部分?   java比较两个字符串,并突出显示发现的不匹配项   java带抽屉布局,无论哪个屏幕处于活动状态,如何在按下后退键时关闭应用程序?   爪哇:颜色有什么区别。黑色和彩色。黑色   Velocity模板中子类的java访问方法   java如何快速学习Drools或其他规则引擎   从Java应用程序访问时缓存数据库查询结果   java cassandra nodetool JPLISAgent。c错误   java我正在解析一个没有pubDate的RSS提要,有没有其他方法可以确定一个项目是何时发布的?