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 |
MySQL versions from 3.23 to 5.5; |
有趣的是,不管是 PyMySQL,还是 MySQL-python,或者后来取而代之的 mysqlclient,它们在用法上几乎完全一致:都是基于 Python database API version 2.0,这个标准也被称作 PEP-0249。这意味着,我们不用修改代码,就可以更换数据库客户端。下面的应用实例证明了这一点:除了模块名字不一样,其余代码完全一致。
姿势1:以元组形式返回查询记录
我们以 PyMySQL 模块为例,先来看看最常见的用法:以元组形式返回查询记录。如果把代码中的 pymysql 改为 MySQLdb,可以轻松切换成 mysqlclient 模块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>>> 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 模块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>>> 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 典型的事务回滚应用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
>>> 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