浅谈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网络编程学习笔记(10):webpy框架
Jun 09 Python
python执行等待程序直到第二天零点的方法
Apr 23 Python
举例讲解Python中装饰器的用法
Apr 27 Python
Python urllib、urllib2、httplib抓取网页代码实例
May 09 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
详解Python3中yield生成器的用法
Aug 20 Python
常见python正则用法的简单实例
Jun 21 Python
基于hashlib模块--加密(详解)
Jun 21 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 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中JSON的使用与转换
2015/01/14 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
javascript动画浅析
2012/08/30 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
让python在hadoop上跑起来
2016/01/27 Python
python自定义异常实例详解
2017/07/11 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
HR喜欢的自荐信格式
2013/10/08 职场文书
工商管理专业应届生求职信
2013/11/04 职场文书
就业协议书的作用
2014/04/11 职场文书
银行奉献演讲稿
2014/09/16 职场文书
学期个人自我总结
2015/02/13 职场文书
2015年度物流工作总结
2015/04/30 职场文书
领导干部失职检讨书
2015/05/05 职场文书
物业公司管理制度
2015/08/05 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
解析Java异步之call future
2021/06/14 Java/Android
Pytest中skip skipif跳过用例详解
2021/06/30 Python
Oracle表空间与权限的深入讲解
2021/11/17 Oracle
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript