如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制。

1、python上下文管理(with)

python上下文管理(context),解决的是这样一类问题,在进入逻辑之前需要进行一些准备工作,在退出逻辑之前需要进行一些善后工作,上下文管理可以使得这种场景变得清晰和可控。

with语句是python上下文管理的基本用法,例如读写文件

with open('filea', r) as f:

f.readlines()

file使用的就是上下文管理机制,这样对于打开文件句柄和释放文件句柄无须我们额外的投入精力。

2、sqlite3

sqlite3是一个嵌入式的文件数据库,无须开启额外的进程和端口,就可以通过文件读取的方式实现数据库的操作。优点是轻量级并且支持事务和触发器等高级特性。

sqlite3在python句柄创建和管理上跟mysql表现的很相似。

3、代码

我们先贴上本文简述的这段代码,然后后面我们在做详细解释。

#-*- coding:utf-8 -*-

importsqlite3importtracebackclassSqliteDB(object):def __init__(self, database='sqlitedb', isolation_level='', ignore_exc=False):

self.database=database

self.isolation_level=isolation_level

self.ignore_exc=ignore_exc

self.connection=None

self.cursor=Nonedef __enter__(self):try:

self.connection= sqlite3.connect(database=self.database, isolation_level=self.isolation_level)

self.cursor=self.connection.cursor()returnself.cursorexceptException, ex:

traceback.print_exc()raiseexdef __exit__(self, exc_type, exc_val, exc_tb):try:if not exc_type isNone:

self.connection.rollback()returnself.ignore_excelse:

self.connection.commit()exceptException, ex:

traceback.print_exc()raiseexfinally:

self.cursor.close()

self.connection.close()

我们给出一个使用的case

if __name__ == '__main__':#建表

with SqliteDB('test') as db:

db.execute('create table if not exists user (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100), age INTEGER)')#创建一条记录, 如果抛出异常, 可以测试事务回滚

with SqliteDB('test') as db:

db.execute('insert into user (name, age) values (?, ?)', ('Tom', 10))#raise Exception()

#查询记录

with SqliteDB('test') as db:

query_set= db.execute('select * from user where name=? limit ?', ('Tom', 100,)).fetchall()printlen(query_set)for item inquery_set:printitem#删除记录

with SqliteDB('test') as db:

query_set= db.execute('delete from user where name=?', ('Tom',))

可以看到通过with语句打开了数据库的句柄,执行数据库操作后,我们并没有管理句柄的释放和事务回滚。

代码的输出是:

1(6, u'Tom', 10)

当打开raise Exception()的注释,表示在插入的过程中遇到了异常。这时候所有connection中未被提交的数据将被回滚。

那么,这些如何做到的呢?

上下文管理是通过类SqliteDB中的__enter__和__exit__两个魔法函数实现的。

1、enter函数,用来实现处理进入with_body之前的准备工作,这里是创建connect和cursor,enter方法返回了cursor。

enter函数如果有返回值,那么可以赋值给as后面的变量,如果没有返回,可以简单的去掉as子句即可。我们给出一个没有as子句的例子

lock =threading.Lock()

with lock:pass

如果enter函数抛出异常,那么在执行with语句的时候会抛出这个异常,并且中断程序。

2、逻辑上,enter函数之后,便开始执行with_body内的代码,with_body里的代码包含sql语句和一些业务逻辑,这里说明一下,只要是抛出异常就会触发事务的回滚机制,而不会区分到底是sql语句执行异常还是业务逻辑出现的异常。

3、exit函数,在with_body执行成功或者抛出异常后会执行exit函数。

exit函数传入三个变量,分别是exc_type异常类型,exc_val异常值,exc_tb错误堆栈信息。如果程序正常,那么三个值都是None,相反如果不是None,那么可以就此判断with_body产生了异常。

这里,我们判断了exc_type是否为None,来区分是否抛出了异常,如果抛出了异常我们使用connection.rollback进行了事务的回滚,否则我们使用connection.commit进行事务提交。

要注意的是,在出现异常的时候,返回了一个ignore_exc,这个返回如果是True,表示忽略这个异常,这个异常将不会向上级调用抛出,如果返回的是None或者False,异常将会向上抛出。实际中我们还是希望异常能够跑出来,方便处理,所以这里我们默认为False。

注意:

isolation_level这个字段是隔离级别,这里我们不做深入的说明。需要知道的是这个字段

1)传入空字符串‘’,表示手动提交commit,这时需要程序中显示的执行connection.commit进行事务提交,sql中的dml语句才会生效。

2)传入None,表示开启自动提交,这时候自动提交commit,无需在程序中connection.commit进行事务提交。

python sqlite3事务_python使用上下文管理器实现sqlite3事务机制相关推荐

  1. python上下文管理关键字_详解 Python 中的 with 与 上下文管理器

    with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管理的例子.你一定已经相当熟悉了,我就不再废话了 ...

  2. 读书笔记:《流畅的Python》第15章 上下文管理器和else块

    # 第15章 上下文管理器和else块""" 本章内容提要:with语句和上下文管理器for while try语句的else子句 """# ...

  3. python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式

    with语句 简单又安全 with open('1.txt','w') as f: f.write('hello,world') 上下文管理器 with语句之所以这么强大,背后是由上下文管理器做支撑的 ...

  4. python语言使用什么语句实现上下文管理协议_Python 上下文管理器

    上下文管理器 在使用Python编程中,可以会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作. 例如:当需要操作文件或数 ...

  5. Python 上下文管理器和with块 一

    上下文管理器对象存在的目的是管理 with 语句,就像迭代器的存在是为了管理 for 语句一样 上下文管理器协议包含 __enter__ 和 __exit__ 两个方法 把值绑定到目标变量上(as 子 ...

  6. python 计时器_Python上下文管理器的魔力

    点击关注我哦 一篇文章带你了解Python上下文管理器的魔力 小编将为您准备一份很棒的Python上下文管理器使用指南,这将使您的代码更具可读性和可靠性,降低您的错误发生率. 资源管理器是我们在任何编 ...

  7. python语言使用什么语句实现上下文管理协议_Python 技巧探究:上下文管理器和with语句...

    一:前言 Python 里面的 with 语句是被认为是晦涩难懂的特征之一,但是当你窥视它的内部你就会发现这里面并没有什么魔法.事实上它可以帮助我们写一些整洁和可读性高的代码. 那么 with 语句适 ...

  8. python语言使用什么语句实现上下文管理协议_Python with语句上下文管理器两种实现方法分析...

    本文实例讲述了Python with语句上下文管理器.分享给大家供大家参考,具体如下: 在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后, ...

  9. python 多态 锁_python 上下文管理器,多态,数据锁定与自省,

    python 上下文管理器,多态,数据锁定与自省, 前文课题 通过装饰器来实现单例模式 通过类实现一个通用装饰器,皆可以装饰函数也可装饰类,即可有参也可无参 描述 new str repr call ...

最新文章

  1. 如何写一份让面试官眼前一亮的简历?
  2. Linux笔记(更改权限chmod,更改所有组chown,umask,隐藏权限chattr)
  3. HTML基本介绍与操作
  4. Android XML 不常用属性
  5. 如何在Chatbot中应用深度学习
  6. Android之编程中存在性能影响的主要方面
  7. Java—synchronized和ReentrantLock锁详解
  8. 讯时网关IP对接PBX
  9. 折线图后面无数据_老板让数据师分析二八法则,此图表完美解决,项目管理师专用图表...
  10. freeCodeCamp 221题
  11. SpringBoot2.0高级案例(02) :整合 RocketMQ ,实现请求异步处理
  12. 海康威视 摄像头 RTMP 转 FLV
  13. 人工智能数学基础--概率与统计8:一个很有意思的下棋输赢概率问题
  14. 如何通过DAU分析活跃用户?(案例:python绘制箱体图)
  15. 修改U盘、移动硬盘时提示目标文件夹访问被拒绝的问题解决思路
  16. android A~Z通讯录排序索引
  17. linux的的shell记忆
  18. 计算机研究生怎么研究黑洞,麻省理工学院研究生的工作使黑洞的事件视野成为可能...
  19. 内网渗透-横向渗透2
  20. 奋斗吧,程序员——第四十二章 会挽雕弓如满月,西北望,射天狼

热门文章

  1. ffmpeg命令_使用ffmpeg命令为多个短视频修改视频备注说明
  2. lombok原理_听说学会用 Lombok 就可以让你早点下班?(你还不看)
  3. 阿里达摩院发布2019年十大科技趋势
  4. java几种遍历方式以及效率对比
  5. 1192 约瑟夫问题(1)
  6. Unity OnTriggerEnter不调用
  7. 四元数,欧拉角,旋转矩阵相互转换
  8. 龙蜥社区成立系统运维SIG,开源sysAK系统运维工具集
  9. 基于X-Engine引擎的实时历史数据库解决方案揭秘
  10. 阿里云专属数据库,重新定义云数据库新形态