复用性|代码设计优化,如何优雅的使用Python实现数据库操作


复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
在之前文章中介绍了如何使用Python操作Mysql、SQLite、Oracle等结构化数据库 , 使用方式大同小异 。 总结一下 , Python操作结构化数据库的大致流程如下:

  1. 创建数据库连接对象 。
  2. 创建游标对象 。
  3. 利用游标对象 , 执行SQL语句命令 。
  4. 若是select操作 , 获取返回结果 , 根据需要进行处理 。
  5. 若是DML的insert、delete、update操作 , 需要提交到数据库 。
  6. 关闭游标对象 。
  7. 关闭数据库连接 。
本文将以SQLite数据库为例 , 分享如何设计代码 , 以优雅、简洁、高效的方式实现数据库操作 。
我们以如下Student_Information表 , 作为示例表, 表结构及示例数据为:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
曾经的代码设计代码设计如下 , 流水账式的代码 , 虽然能够满足当前的查询需求 , 但代码复用性、简洁、优雅无从谈起 。 虽然我们不强调过早优化代码 , 但为了避免重复开发 , 还是要考虑其复用性 , 简洁性 。
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
执行上述代码 , 输出结果如下:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
后来的代码设计我们考虑到作为查询操作 , 通常涉及频繁的查询操作 。 如果频繁链接、关闭会影响程序的查询效率 , 同时按照上面的设计模式 , 很难灵活的复用之前的代码 , 作为此类元操作 , 通用性不足 。
于是 , 我们考虑将其封装成一个类 , 方便后续调用 , 如下:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
根据如上代码设计 , 我们将数据库查询操作的封装成类 , 相关连接、sql执行、游标数据库关闭等步骤封装为类的方法 。 此时如果我们要进行频繁的数据库查询操作 , 又不想因频繁的链接、关闭数据库 , 影响查询效率 , 我们可以这样实现 , 如下:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
首先实例化Search类 , 然后调用connect方法获取连接和游标 , 遍历SQL列表实现依次查询 , 获取结果 , 最后关闭游标、数据库连接 。
整个查询过程虽然进行了很多次查询 , 但只进行了一次连接、关闭数据库连接操作 , 提高了查询效率 , 同时也很好的提高了代码的复用性 。
若在不同的开发需求场景中查询操作独立且不频繁 , 那么我们可以使用search_all方法 , 如下 , 我们实例化Search类 , 只需调用search_all方法 , 即可完成一次完整查询操作 , 包含的链接的关闭操作 , 如下:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
现在的代码设计上面代码中我们将数据库、游标的关闭操封装到了close方法中 , 这样的设计会存在一个潜在的风险 , 就是当查询过程中出现异常时 , close方法是无法执行的 , 数据库和游标无法关闭 , 导致资源占用 。
因此我们需要进一步优化 , 我们以Search类中的search_all方法为例 , 通过try…except …finally …异常处理 , 保证无论是否发生异常 , 数据库链接和游标都可以被关闭 , 如下:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
有没有更优雅的方式?在之前文章介绍过Python的上下文管理器 , 个人非常喜欢Python的这个特性 , 接下来 , 我们通过上下文管理器 , 来更简洁的实现数据库查询操作 , 如下:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
【复用性|代码设计优化,如何优雅的使用Python实现数据库操作】如下 , 我们使用上下文管理器 , 优雅的实现数据库的查询 , 无论是否发生异常 , 游标和数据库连接都会在结束时被关闭 , 如下:
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
复用性|代码设计优化,如何优雅的使用Python实现数据库操作文章插图
?相关阅读:
Python mysql-connector模块实现MySQL增删改查等操作
文件存储?轻量级数据库应用——Python SQLite 模块详解
更加优雅的操作系统资源与处理异常 , 深入理解Python上下文管理器