浅谈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文件操作类操作实例详解
Jul 11 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
Jan 20 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
安装Python的教程-Windows
Jul 22 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
python实现的生成word文档功能示例
Aug 23 Python
Python字符串大小写转换拼接删除空白
Sep 19 Python
Python3标准库之functools管理函数的工具详解
Feb 27 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
浅析Python中的join()方法的使用
2015/05/19 Python
简单解析Django框架中的表单验证
2015/07/17 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Python3远程监控程序的实现方法
2019/07/15 Python
Python datetime包函数简单介绍
2019/08/28 Python
python with语句的原理与用法详解
2020/03/30 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
详解pandas映射与数据转换
2021/01/22 Python
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
Java程序员综合测试题
2014/04/25 面试题
班组长安全生产职责
2013/12/16 职场文书
大气污染防治方案
2014/05/19 职场文书
大学生赌博检讨书
2014/09/22 职场文书
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers