浅谈Python访问MySQL的正确姿势
作者:天元浪子 发布时间:2024-01-16 11:22:25
Py2 时代,访问 MySQL 数据库的模块除了 PyMySQL 和 MySQL-python 之外,还有以速度见长的 Umysql,以及非常小众的 Oursql 模块。进入了 Py3 时代之后,PyMySQL 与时俱进,顺利升级到 Py3 版本, MySQL-python 则被它的一个 Py3 分支——mysqlclient 取代,而 Umysql 和 Oursql 则停留在了属于它们的那个时代。
下表给出了 PyMySQL 模块和 mysqlclient 模块在安装方式、导入方式、支持的Python版本和数据库版本等方面的比较。因为缺少可信的资料,这里没有对两个模块的性能做出比较。不过,PyMySQL 明确声明支持最新的 MySQL 和 MariaDB,而 mysqlclient 关于数据库版本支持的描述显得模棱两可、似是而非,所以很多人也许会把 PyMySQL 作为首选。但从我们的实际应用来看,mysqlclient 并没有受到过数据库版本的限制。我更愿意把版本支持的表述解读为两个开发团队风格不同所致。
PyMySQL | mysqlclient | |
---|---|---|
安装方式 | pip install PyMySQL | pip install mysqlclient |
导入方式 | import pymysql | import MySQLdb |
Python版本 | 2.7 and >= 3.4 | 2.7 and >= 3.4 |
数据库版本 | MySQL >= 5.5 MariaDB >= 5.5 | MySQL versions from 3.23 to 5.5; 5.0 or newer recommended. MariaDB should also work. |
有趣的是,不管是 PyMySQL,还是 MySQL-python,或者后来取而代之的 mysqlclient,它们在用法上几乎完全一致:都是基于 Python database API version 2.0,这个标准也被称作 PEP-0249。这意味着,我们不用修改代码,就可以更换数据库客户端。下面的应用实例证明了这一点:除了模块名字不一样,其余代码完全一致。
姿势1:以元组形式返回查询记录
我们以 PyMySQL 模块为例,先来看看最常见的用法:以元组形式返回查询记录。如果把代码中的 pymysql 改为 MySQLdb,可以轻松切换成 mysqlclient 模块。
>>> import pymysql
>>> db = pymysql.connect(
host = 'localhost',
user = 'xufive',
password = '********',
db = 'demo',
charset = 'utf8'
)
>>> cursor = db.cursor()
>>> cursor.execute('select * from member where id = %s', (100,))
1
>>> print(cursor.fetchall())
((100, '370103********0012', '*9EE8E3304D69C3E9260F19C224EA5852129BF030', '王茁洋', '男', datetime.date(****, **, **), '', '济南', '济南泉景小学', '186********', Decimal('1812.50')),)
>>> cursor.close()
>>> db.close()
姿势2:以字典形式返回查询记录
查询结果以元组形式返回,有很多不便,我们需要知道元组各元素对应的是表结构中的哪一个字段(列)。下面的代码,实现了以字典形式返回查询记录。同样的,如果把代码中的 MySQLdb 改为 pymysql,可以轻松切换成 PyMySQL 模块。
>>> import MySQLdb.cursors
>>> db = MySQLdb.connect(
host = 'localhost',
user = 'xufive',
password = '********',
db = 'demo',
charset = 'utf8',
cursorclass = MySQLdb.cursors.DictCursor
)
>>> with db.cursor() as cursor:
sql = 'select * from member where id = %s'
cursor.execute(sql, (100,))
print(cursor.fetchall())
1
({'id': 100, 'idcard': '370103********0012', 'passwd': '*9EE8E3304D69C3E9260F19C224EA5852129BF030', 'name': '王茁洋', 'sex': '男', 'birthday': datetime.date(****, **, **), 'title': '', 'address': '济南', 'club': '济南泉景小学', 'phone': '186********', 'rating': Decimal('1812.50')},)
姿势3:事务回滚
事务是关系型数据库的重要特性,NoSQL数据库、分布式数据库通常会淡化、甚至放弃事务。所谓事务是将一组DML(insert、update、delete)语句组合在一起形成一个逻辑单元,这些操作要么全部执行成功提交(commit),如果不成功就要回退到事务开始之前的状态(rollback),以确保不会停留在错误的中间状态。下面的代码演示了 MySQL 典型的事务回滚应用。
>>> import pymysql
>>> db = pymysql.connect(
host = 'localhost',
user = 'xufive',
password = '********',
db = 'demo',
charset = 'utf8'
)
def transaction(db):
try:
db.begin()
# 此处加入出错之后需要回滚的DML(insert、update、delete)语句
db.commit()
return True
except:
db.rollback()
return False
来源:https://blog.csdn.net/xufive/article/details/103856837
猜你喜欢
- 下列语句部分是Mssql语句,不可以在access中使用。SQL语句分类:DDL—数据定义语言(CREATE,ALTER,DROP,DECL
- 对于什么是好设计,一万个人那里至少有一万零一个答案。每个人都有自己的答案,有的人还不止一个答案。老师说,一定要在设计里灌注自己的思想,有了自
- 首先让我们看下 YUI 是如何处理的:var toObject = function(a) { var o = {
- 举个例子:q=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]我想获取其中值等于7的那个值的下标,以便于用于其
- 目录引言环境代码实现准备工作获取并存储好友头像信息生成微信好友墙后记引言前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张
- 一 概念1. 原理2. 好处不同项目可能用到的环境不同,运用虚拟环境能将不同环境分隔开二 virtualenvvirtual 虚拟的1. 安
- 建立cards_main文件:# _*_ coding:utf-8 _*_"""file: cards_mai
- 这次我们讨论的是,区分有单选框的选项和普通的选项~~乍听起来,可能不太理解我说了什么,下面举个例子先~~1、标签的单选~~例如QQ秀的支付流
- 本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下目录简介实现过程结语简介使用python实现pygame版的五
- 一 web框架的本质及自定义web框架我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket
- 开发需求python 3.7+pygame 1.9+演示项目地址https://github.com/Mr-han11/PythonSupe
- 基本上快被这个问题搞疯了,症状如下症状描述:在ie下(6或7,8没有试过)当出现中英文混排,都采用默认字体时,并使用 li 列表做float
- 用pycharm和pyqt5,想写一个弹出窗口的程序,如下:class video_record(QWidget): &nbs
- function createHashDir($sign) { $md5 = md5($sign); if(!is_dir(MB_CACHE
- 多线程到底什么是多线程?说起多线程我们首先从单线程来说。例如,我在这里看书,等这件事情干完,我就再去听音乐。对于这两件事情来说都是属于单线程
- IE的有条件注释是一种专有的(因此是非标准的)、对常规(X)HTML注释的Miscrosoft扩展。顾名思义,有条件注释使你能够根据条件(比
- 内容摘要:这篇文章的主旨是弄清楚如何根据实际需求实现一个联动菜单以及联动菜单的原理,实例是实现一个日期选择下拉菜单。首先来分析一下日期下拉菜
- 我们知道IE6是不支持透明的PNG的,这无疑限制了网页设计的发挥空间.然而整个互联网上解决这个IE6的透明PNG的方案也是多不胜数,从使用I
- 目录方法一:直接调用函数运行方法二:使用偏函数来执行方法三:使用 eval 动态执行方法四:使用 getattr 动态获取执行方法五:使用类
- 在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限