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进行事务提交。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 6 中的多线程是如何实现的!?

作者 | 张彦飞allen来源 | 开发内功修炼Redis 是一个高性能服务端的典范。它通过多路复用 epoll 来管理海量的用户连接,只使用一个线程来通过事件循环来处理所有用户请求,就可以达到每秒数万 QPS 的处理能力。下图是单线程版本 Redis 工作的核心原理图单…

如何构建流量无损的在线应用架构 | 专题开篇

简介:本篇是整个《如何构建流量无损的在线应用架构》系列的第一篇,这一系列共三篇,旨在使用最为朴素的语言将影响在线应用流量稳定性的技术问题做一个归类,这些问题的解决方案有的只是一些代码层面的细节,有的需要工具…

云原生时代的运维体系进化

简介:基于容器、Kubernetes 等云原生技术,提供的开放社区标准、不可变基础设施、声明式 API 会成为企业 CloudOps 的最佳实践,也将在这个基础上推进数据化、智能化体系建设,将运维复杂性进一步下沉,让企业可以聚焦于自…

python 抽象语法树_用python演示一个简单的AST(抽象语法树)

假设对‘a 3 * b‘进行解释,其中a2,b5代码很简单,就不再进行详细的解释了。Num lambda env, n: nVar lambda env, x: env[x]Add lambda env, a, b:_eval(env, a) _eval(env, b)Mul lambda env, a, b:_eval(env, a) * _eval(env, b)_eva…

企业如何从 0 到 1 构建整套全链路追踪体系

简介:本文将分享 ARMS 在全链路追踪领域的最佳实践,分享主要分为四部分。首先,是对分布式链路追踪的整体简介。其次,是对 ARMS 在分布式链路追踪领域的核心能力进行介绍。然后,介绍如何从 0 到 1 构建整套全链路追踪体…

React18 的 useEffect 新特性为什么被疯狂吐槽?

作者 | 零一来源 | 前端印象react18 已经出来一段时间了,create-react-app 默认安装的 React 版本也已经是 18,不知道有没有小伙伴发现自己有点看不懂 React 了?import { useEffect, useState } from reactfunction App () {const [data, set…

如何构建一个流量无损的在线应用架构 | 专题中篇

简介:本篇是整个《如何流量无损的在线应用架构》系列的第二篇,这一系列共三篇,旨在使用最为朴素的语言将影响在线应用流量稳定性的技术问题做一个归类,这些问题的解决方案有的只是一些代码层面的细节,有的需要工具进行…

一文读懂蓝绿发布、A/B 测试和金丝雀发布的优缺点

简介:目前,业界已经总结出了几种常见的服务发布策略来解决版本升级过程中带来的流量有损问题。本文首先会对这些普遍的发布策略进行简单的原理解析,最后结合阿里云的云原生网关对这些发布策略进行实践。 作者 | 扬少 背景 目前&#xff0c…

Kafka 到底有多高可靠?

作者 | 敖丙来源 | 敖丙什么叫可靠性?大家都知道,系统架构有三高:「高性能、高并发和高可用」,三者的重要性不言而喻。对于任意系统,想要同时满足三高都是一件非常困难的事情,大型业务系统或者传统中间件都…

java is start_PHP IntlChar::isJavaIDStart()用法及代码示例

IntlChar::isJavaIDStart()函数是PHP中的一个内置函数,用于检查输入字符代码点是否允许,因为第一个字符是Java标识符。对于具有常规类别“Sc”(货币符号)和“Pc”(连接标点符号)的字符而言,它是正确的。用法:bool IntlChar::isJavaIDStart( $…

阿里云张振尧:阿里云边缘云驱动5G时代行业新价值

简介:近日,以“5G融合通信趋势下的技术创新”为主题的2021中国增值电信及虚拟运营高峰论坛在北京召开,阿里云边缘云高级产品专家张振尧发表了《阿里云边缘云驱动5G时代行业新价值》主题演讲,分享了阿里云边缘云作为5G时代的新基础…

美的工业技术亮相2022汉诺威工业博览会,助力全球工业向数字化与可持续迈进

2022年5月31日,2022汉诺威工业博览会开幕并重启线下展览,美的工业技术以“科技驱动,拥抱高效、绿色、智能的工业未来”为主题,携旗下工业自动化品牌“高创”、 “合康新能”和“东菱”,以覆盖自动化、绿色能源领域的领…

vue 传递 对象 路由_vue中路由参数传递可能会遇到的坑

前言vue中路由跳转传参数有多种,自己常用的是下面的几种通过router-link进行跳转通过编程导航进行路由跳转本文主要给大家介绍了关于vue路由参数传递遇到的一些坑,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。首先我的路…

hyengine - 面向移动端的高性能通用编译/解释引擎

简介:手机淘宝客户端在历史上接过多种多样的脚本引擎,用于支持的语言包括:js/python/wasm/lua,其中js引擎接过的就有:javascriptcore/duktape/v8/quickjs 等多个。众多的引擎会面临共同面临包大小及性能相关的问题&…

如何进行基于Anolis OS的企业级Java应用规模化实践?|龙蜥技术

简介:提供了724小时的专属钉钉或者电话支持,响应时间保证到在业务不可用情况下10分钟响应,业务一般的问题在一小时可以获得响应,主要城市可以两小时内得到到达现场的服务。 本文作者郁磊,是Java语言与虚拟机SIG负责人…

大数据的下一站 DataOps,智领云发布纯 K8s 云原生数据平台 BDOS Online

最近几年,业界对数据中台的追捧度像坐过山车从高点走低,但在数字化和业务创新驱动下,对数据管理与分析的热度在今年不降反升。 以往搭建一套 Hadoop 大数据平台,技术团队重点要搞定数据的采集、存储、处理和数仓的设计搭建等复杂动…

dexpress 流程图_DevExpress常用操作

1、 如何解决单击记录整行选中的问题View->OptionsBehavior->EditorShowMode 设置为:Click2、 如何新增一条记录(1)、gridView.AddNewRow()(2)、实现 gridView_InitNewRow 事件3、如何解决 GridControl 记录能获取而没有显示出来的问题gridView.populateColum…

“全”事件触发:阿里云函数计算与事件总线产品完成全面深度集成

简介:目前,函数计算已具备接入EventBridge所有事件源的触发能力,实现触达阿里云全系产品服务的“最后一公里”。 作者:史明伟(世如)阿里云高级技术专家 随着云原生技术的普及和落地,企业在构建…

开源 Serverless 里程碑:Knative 1.0 来了

简介:近期Knative发布了1.0版本,达到了一个重要的里程碑。Knative自2018年7月首次发布以来, 版本不断的迭代发展,除了无数的错误修复、稳定性和性能增强之外,按时间顺序还进行了一些改进,下文将进行简单介绍。 作者&a…

勒索软件攻击层出不穷,企业如何做好数据保护?

近日,“搜狐员工遭遇工资补助诈骗”事件引起广泛热议:搜狐员工收到一封来自“搜狐财务部”名为《5月份员工工资补助通知》的邮件,员工按照邮件要求扫码,填写银行账号等信息后,大家并没有等到“补助”,并且工…