浅谈Python访问MySQL的正确姿势

作者:天元浪子 时间:2024-01-16 11:22:25 

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 并没有受到过数据库版本的限制。我更愿意把版本支持的表述解读为两个开发团队风格不同所致。


PyMySQLmysqlclient
安装方式pip install PyMySQLpip install mysqlclient
导入方式import pymysqlimport MySQLdb
Python版本2.7 and >= 3.42.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  

来源:https://blog.csdn.net/xufive/article/details/103856837

标签:Python,访问,MySQL
0
投稿

猜你喜欢

  • python3 面向对象__类的内置属性与方法的实例代码

    2023-03-24 10:03:19
  • switchery按钮的使用方法

    2024-04-29 13:40:44
  • Django与数据库交互的实现

    2024-01-15 19:23:20
  • js打开新窗口方法代码收集

    2007-09-05 19:20:00
  • Mysql误删数据解决方案及kill语句原理

    2024-01-26 20:22:15
  • jQuery页面滚动浮动层智能定位实例代码

    2024-04-22 22:22:16
  • Python数据可视化:幂律分布实例详解

    2021-08-23 16:27:29
  • Sql Server 2000内存调整

    2010-04-25 11:24:00
  • pytorch中的model.eval()和BN层的使用

    2023-09-21 17:06:10
  • python文件比较示例分享

    2023-03-17 21:10:23
  • python数据可视化pygal模拟掷骰子实现示例

    2021-06-21 07:31:35
  • 关于python环境变量如何配置

    2023-06-02 14:23:09
  • python验证码识别的示例代码

    2023-08-04 03:20:24
  • Python轻松破解加密压缩包教程详解

    2021-04-12 13:26:45
  • ubuntu 安装pyqt5和卸载pyQt5的方法

    2021-08-25 07:18:41
  • SQL Server中的SELECT会阻塞SELECT吗

    2024-01-25 18:08:30
  • 解析SQL Server中数据库快照的工作原理

    2009-02-19 17:04:00
  • Django实现一对多表模型的跨表查询方法

    2022-04-09 01:53:33
  • Python实现将绝对URL替换成相对URL的方法

    2023-08-28 13:40:08
  • python使用Plotly绘图工具绘制柱状图

    2021-10-05 00:22:34
  • asp之家 网络编程 m.aspxhome.com