浅谈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参数和作用域的使用
Nov 01 Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 Python
Python实时获取cmd的输出
Dec 13 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
谈一谈基于python的面向对象编程基础
May 21 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
python tkinter canvas使用实例
Nov 04 Python
python类共享变量操作
Sep 03 Python
如何利用python正则表达式匹配版本信息
Dec 09 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 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 操作excel文件的方法小结
2009/12/31 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
python提取内容关键词的方法
2015/03/16 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
Django框架实现的分页demo示例
2019/05/25 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
阿拉伯书店:Jamalon
2019/07/24 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
体育教师工作总结的自我评价
2013/10/10 职场文书
毕业生个人求职信范例分享
2013/12/17 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
《春天来了》教学反思
2014/04/07 职场文书
李敖北大演讲稿
2014/05/24 职场文书
安全口号大全
2014/06/21 职场文书
班级标语大全
2014/06/21 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
员工试用期自我评价
2014/09/18 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书