前言
在前两篇文章中,我们详细介绍了SQLAlchemy异步DBManager的封装过程。第一篇文章帮助我们入门理解了整体的封装结构和思路,第二篇文章则帮助我们更加熟悉和掌握了这个封装的使用。我们已经介绍了添加和查询操作,并且对整体的封装思路有了深入的了解。
在本文中,我将继续扩展封装,介绍如何进行更新和删除操作。同时,我将演示如何执行原生的SQL语句,并介绍在异常情况下如何进行事务回滚的场景。这些内容将帮助我们更全面地应对各种数据库操作的需求。
更新封装
1 | python复制代码from sqlalchemy import Result, column, delete, func, select, text, update |
- update 方法通过 sqlaichemy 的 update 来组织sql语句进行条件更新
- update_or_add 则是指定对象进行更新或新增操作,有主键id则更新,没有则添加,具体是使用 session.merge 方法进行操作。入参的 table_obj 可以是库表映射类实例对象、dict,字典形式则是通过 Manager 下的orm_table 进行转换成映射类实例对象来操作。
1 | python复制代码class UserFileTable(BaseOrmTable): |
删除封装
1 | python复制代码@with_session |
- 通过主键ID单个删除,组织
conds = [orm_table.id == pk_id]
,调用 delete 方法 - 通过主键ID列表批量删,组织
conds = [orm_table.id.in_(pk_ids)]
调用 delete 方法
这两种删除操作都是通过调用 delete 方法实现的。默认情况下,这些操作执行的是物理删除。对于一些重要的数据,我们也可以选择执行逻辑删除。在逻辑删除中,默认使用 deleted_at
字段来记录删除时间。我们也可以指定具体的逻辑删除字段 logic_field
,以及逻辑字段的赋值情况 logic_del_set_value
,然后进行一个更新操作来实现逻辑删除。
如下是删除前的数据
1 | python复制代码 |
删除结果展示
1 | python复制代码file_count 20 |
主键id 为5、6的被逻辑删除了,10,11,12,13 被物理删除了。
执行原生sql
1 | python复制代码 |
内部执行sql时需要通过 sqlaichemy 的 text 函数转一下,然后根据 query_one 的值来确定查询单条还是多条。
1 | python复制代码async def run_raw_sql_demo(): |
需要注意的执行原生sql,sql参数的展位符是 :param_name 冒号后面接参数名称,然后参数对应的值则是字典形式组织。
查询结果如下
1 | python复制代码count_ret {'total_count': 16} |
事务回滚操作
1 | python复制代码async def create_and_transaction_demo(): |
这里通过 transaction() 获取事务会话 session,让后面的数据库操作都指定 session 参数,with_session 装饰器就不会再次构造,实现了共用一个 session,事务内的操作要么都成功要么都失败。
整体封装总结
- SQLAIchemyManager 设计
+ 用于初始化数据库配置信息
- BaseOrmTable、TimestampColumns、BaseOrmTableWithTS 设计
+ 通用库表映射类,一些主键id,时间戳字段让子类继承共享,以及 to\_dict 方法将对象属性转成字典
- transaction 上下文管理器(事务会话)
+ 便捷的进行事务处理
- with_session 装饰器
+ 复用开启事务会话 session 操作,减少冗余代码,没有 session 则动态的构造 session,兼容整体事务会话
- orm_table 设计
+ 让继承DBManager的子类指定 orm\_table ,数据库操作时明确知道具体库表,减少参数传递
- DBManager 设计
+ 封装了通用的CRUD方法,让子类可以共享和复用这些方法,推荐子类进行常用业务数据查询封装,实现业务逻辑的复用和灵活性。
- 查询扁平化 flat
+ 查询结果可以直接使用,不需要额外处理,简化了操作流程。
- 字典与库表映射类实例
+ 一些方法的入参,同时支持字典与库表映射类实例,提高了方法的通用性和灵活性。
- 分页查询
+ 指定页码、每页大小查询出总数与分页数据
- 逻辑删除
+ 支持默认的 `deleted_at` 字段 or 指定逻辑字段进行逻辑删除,保留重要数据
- 执行原生sql
+ 一些复杂sql操作,不使用 orm 组织,推荐使用原生 sql 进行操作
到这就结束了,希望这些封装,可以满足各种复杂业务场景下的需求,提高数据库操作的灵活性和适用性,从而提高我们的开发效率。让代码变得更简单。
Github源代码
源代码已上传到了Github,里面也有具体的使用Demo,欢迎大家一起体验、贡献。
HuiDBK/py-tools: 打造 Python 开发常用的工具,让Coding变得更简单 (github.com)
本文转载自: 掘金