背景
在实际项目中我们会在项目的各个角落进行数据库访问操作,显然我们需要将对数据库的访问做一定的封装,在统一管理的基础上也可以做一些额外的优化。
所以我们打算实现一个叫做MysqlClient的类对数据库访问做统一管理,我们期待它的作用有:
- 统一管理数据库访问凭证
- 对
query和execute两类操作进行封装 - 预处理sql以防 SQL注入
- 引入数据库连接池
- 合适的错误检查与记录
- 以及如何正确使用
在百度上随便一搜就能搜到类似的实现,不过他们大部分都是只实现了对query,execute的封装,少部分加上了预处理sql,我希望提供一个更完整的MysqlClient实现。
我最初也是在百度上复制了一个封装了query、execute两个操作的MysqlClient,后来被公司安全部门提示有sql注入风险,所幸将平常遇到的对数据库访问对象的需求一次考虑清楚设计一个比较完善的实现。
上代码
Python 3.7,遵循 PEP8 代码风格
1 | # encoding: utf-8 |
总结
外部访问时通过调用
get_mysql_client()函数来获得单例的 MysqlClient。实现单例模式最简单的方法:在模块内定义变量,模块被import时被初始化
watch_prepared_statement()函数用于观察预处理后的sql语句通俗地说,预处理就是把 % 变为 ,
get_session()是相对独立的一部分,在使用如 SQLAlchemy 这样的ORM框架时会用到。提供了
get_connection()用于完成不常用的数据库操作,当然如果在项目层面常用也可以增加额外的封装方法。数据库连接池部分还可以对cache,连接数做额外的配置,这个可以根据项目实际需求做改动。
对配置信息部分,还可以引入
ConfigParser对其进行统一管理在配置文件。