浅谈Python访问MySQL的正确姿势


Posted in Python onJanuary 07, 2020

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python高效编程技巧
Jan 07 Python
python使用多线程不断刷新网页的方法
Mar 31 Python
Python脚本实现虾米网签到功能
Apr 12 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
Python合并多个Excel数据的方法
Jul 16 Python
python实现飞机大战微信小游戏
Mar 21 Python
python批量爬取下载抖音视频
Jun 17 Python
django-crontab实现服务端的定时任务的示例代码
Feb 17 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
python的setattr函数实例用法
Dec 16 Python
pytorch自定义二值化网络层方式
Jan 07 #Python
Pytorch: 自定义网络层实例
Jan 07 #Python
Python StringIO如何在内存中读写str
Jan 07 #Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 #Python
python模拟实现斗地主发牌
Jan 07 #Python
python全局变量引用与修改过程解析
Jan 07 #Python
python__new__内置静态方法使用解析
Jan 07 #Python
You might like
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
JS二分查找算法详解
2017/11/01 Javascript
js中url对象化管理分析
2017/12/29 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
django Serializer序列化使用方法详解
2018/10/16 Python
Python中请不要再用re.compile了
2019/06/30 Python
Python实现图片添加文字
2019/11/26 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
How TDD works
2012/09/30 面试题
2014年百日安全生产活动总结
2014/05/04 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
请假条应该怎么写?
2019/06/24 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL