浅谈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 并没有受到过数据库版本的限制。我更愿意把版本支持的表述解读为两个开发团队风格不同所致。
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
来源:https://blog.csdn.net/xufive/article/details/103856837


猜你喜欢
- 简介本文分享的实例代码主要通过python语言实现批量替换页眉页脚的操作功能,具体如下。代码#!/usr/bin/env python# -
- 遇到一个小问题,记录一下问题:在微信小程序中使用scroll-view标签时,用height:cale(xx - xx)设置高度无效,在pa
- 本文实例为大家分享了ajax实现无刷新上传文件功能的具体代码,供大家参考,具体内容如下详细代码如下<!DOCTYPE HTML>
- 一个几百行代码做出http/https代理服务器的脚本,启动即可做http https透明代理使用python proxy.py 8992使
- 通常我们提交代码一般都是 git add ,git commit -m, git push的这么个流程。添加到暂存区
- 1、yield,将函数变为 generator (生成器)例如:斐波那契数列def fib(num): a, b, c = 1,
- MySQL 系统会在内存(MEMORY)和磁盘(MyISAM)中建立临时表,如何能知道在磁盘中建立了多少临时表以及在内存中建立多
- 我就废话不多说了,直接上代码吧!import torchimport torch.nn.functional as Fimport nump
- 前言之前学习过binarytree第三方库,了解了它定义的各种基本用法。昨天在问答频道中做题时碰到一个关于二叉树的算法填空题,感觉代码不错非
- Django结合ajax进行页面实时更新踩过的坑简单记录一下在使用Django、echarts和ajax实现数据动态更新时遇到的一些坑: 1
- 简介在Python开发和测试过程中主要有两种模式可以选择:脚本模式、命令行模式。在代码的开发和调试过程中使用脚本模式很方便,目前比较主流的命
- 导入相关的包import pygame, sys, randomfrom pygame.locals import *设置屏幕大小以及基本参
- 微信小程序 ES6Promise.all批量上传文件实现代码客户端Page({ onLoad: function() { &nb
- 本文实例讲述了PHP获取客户端及服务器端IP的封装类。分享给大家供大家参考,具体如下:客户端IP相关的变量:1. $_SERVER['
- 一、SQL Server Row_number函数简介ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续
- Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼。装饰器引入初期及问题诞生假如
- 使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到gi
- 随着移动端的用户越来越多,传统的web系统架构无法兼容很多移动终端的正常使用。在工作中也会发现,现在很多的客户都有在手机、平板等移动终端上使
- (wuhen注:document.all是ie特有的属性,不是万维网标准) 当页面上的控件同名且多个的时候,你首先做的是什么?判断长度?的确
- 根据一个爬取豆瓣电影排名的小应用,来简单使用etree和request库。etree使用xpath语法。import requestsimp