python sqlite3事务_python使用上下文管理器实现sqlite3事务机制
如题,本文记录如何使用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事务机制相关推荐
- python上下文管理关键字_详解 Python 中的 with 与 上下文管理器
with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管理的例子.你一定已经相当熟悉了,我就不再废话了 ...
- 读书笔记:《流畅的Python》第15章 上下文管理器和else块
# 第15章 上下文管理器和else块""" 本章内容提要:with语句和上下文管理器for while try语句的else子句 """# ...
- python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式
with语句 简单又安全 with open('1.txt','w') as f: f.write('hello,world') 上下文管理器 with语句之所以这么强大,背后是由上下文管理器做支撑的 ...
- python语言使用什么语句实现上下文管理协议_Python 上下文管理器
上下文管理器 在使用Python编程中,可以会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作. 例如:当需要操作文件或数 ...
- Python 上下文管理器和with块 一
上下文管理器对象存在的目的是管理 with 语句,就像迭代器的存在是为了管理 for 语句一样 上下文管理器协议包含 __enter__ 和 __exit__ 两个方法 把值绑定到目标变量上(as 子 ...
- python 计时器_Python上下文管理器的魔力
点击关注我哦 一篇文章带你了解Python上下文管理器的魔力 小编将为您准备一份很棒的Python上下文管理器使用指南,这将使您的代码更具可读性和可靠性,降低您的错误发生率. 资源管理器是我们在任何编 ...
- python语言使用什么语句实现上下文管理协议_Python 技巧探究:上下文管理器和with语句...
一:前言 Python 里面的 with 语句是被认为是晦涩难懂的特征之一,但是当你窥视它的内部你就会发现这里面并没有什么魔法.事实上它可以帮助我们写一些整洁和可读性高的代码. 那么 with 语句适 ...
- python语言使用什么语句实现上下文管理协议_Python with语句上下文管理器两种实现方法分析...
本文实例讲述了Python with语句上下文管理器.分享给大家供大家参考,具体如下: 在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后, ...
- python 多态 锁_python 上下文管理器,多态,数据锁定与自省,
python 上下文管理器,多态,数据锁定与自省, 前文课题 通过装饰器来实现单例模式 通过类实现一个通用装饰器,皆可以装饰函数也可装饰类,即可有参也可无参 描述 new str repr call ...
最新文章
- 如何写一份让面试官眼前一亮的简历?
- Linux笔记(更改权限chmod,更改所有组chown,umask,隐藏权限chattr)
- HTML基本介绍与操作
- Android XML 不常用属性
- 如何在Chatbot中应用深度学习
- Android之编程中存在性能影响的主要方面
- Java—synchronized和ReentrantLock锁详解
- 讯时网关IP对接PBX
- 折线图后面无数据_老板让数据师分析二八法则,此图表完美解决,项目管理师专用图表...
- freeCodeCamp 221题
- SpringBoot2.0高级案例(02) :整合 RocketMQ ,实现请求异步处理
- 海康威视 摄像头 RTMP 转 FLV
- 人工智能数学基础--概率与统计8:一个很有意思的下棋输赢概率问题
- 如何通过DAU分析活跃用户?(案例:python绘制箱体图)
- 修改U盘、移动硬盘时提示目标文件夹访问被拒绝的问题解决思路
- android A~Z通讯录排序索引
- linux的的shell记忆
- 计算机研究生怎么研究黑洞,麻省理工学院研究生的工作使黑洞的事件视野成为可能...
- 内网渗透-横向渗透2
- 奋斗吧,程序员——第四十二章 会挽雕弓如满月,西北望,射天狼