系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > Mysql > 详细页面

浅谈Python访问MySQL的正确姿势

时间:2020-01-09来源:系统城作者:电脑系统城

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 模块。

 

 
  1. >>> import pymysql
  2. >>> db = pymysql.connect(
  3. host = 'localhost',
  4. user = 'xufive',
  5. password = '********',
  6. db = 'demo',
  7. charset = 'utf8'
  8. )
  9. >>> cursor = db.cursor()
  10. >>> cursor.execute('select * from member where id = %s', (100,))
  11. 1
  12. >>> print(cursor.fetchall())
  13. ((100, '370103********0012', '*9EE8E3304D69C3E9260F19C224EA5852129BF030', '王茁洋', '男', datetime.date(****, **, **), '', '济南', '济南泉景小学', '186********',Decimal('1812.50')),)
  14. >>> cursor.close()
  15. >>> db.close()

姿势2:以字典形式返回查询记录

查询结果以元组形式返回,有很多不便,我们需要知道元组各元素对应的是表结构中的哪一个字段(列)。下面的代码,实现了以字典形式返回查询记录。同样的,如果把代码中的 MySQLdb 改为 pymysql,可以轻松切换成 PyMySQL 模块。


 
  1. >>> import MySQLdb.cursors
  2. >>> db = MySQLdb.connect(
  3. host = 'localhost',
  4. user = 'xufive',
  5. password = '********',
  6. db = 'demo',
  7. charset = 'utf8',
  8. cursorclass = MySQLdb.cursors.DictCursor
  9. )
  10. >>> with db.cursor() as cursor:
  11. sql = 'select * from member where id = %s'
  12. cursor.execute(sql, (100,))
  13. print(cursor.fetchall())
  14. 1
  15. ({'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 典型的事务回滚应用。


 
  1. >>> import pymysql
  2. >>> db = pymysql.connect(
  3. host = 'localhost',
  4. user = 'xufive',
  5. password = '********',
  6. db = 'demo',
  7. charset = 'utf8'
  8. )
  9.  
  10. def transaction(db):
  11. try:
  12. db.begin()
  13. # 此处加入出错之后需要回滚的DML(insert、update、delete)语句
  14. db.commit()
  15. return True
  16. except:
  17. db.rollback()
  18. return False
  19.  

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

分享到:

相关信息

  • MySQL的核心查询语句详解

    一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...

    2023-10-30

  • Mysql中如何删除表重复数据

    Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...

    2023-10-30

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载