一.MySQLdb
1.介绍
MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 的一个驱动,很多框架都也是基于此库进行开发,遗憾的是它只支持 Python2.x,而且安装的时候有很多前置条件,因为它是基于C开发的库,在 Windows 平台安装非常不友好,经常出现失败的情况,现在基本不推荐使用,取代的是它的衍生版本。
2.安装
由于本机是python3.6的环境,无法直接安装MySQLdb,因此选择放弃。但可以考虑装 Mysqlclient。
3.使用
资料传送门: Python 操作 MySQL 数据库 | 菜鸟教程
建立数据库连接
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8',
cursorclass=MySQLdb.cursors.DictCursor)
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()
print "Database version : %s " % data
# 关闭数据库连接
db.close()
推荐指数: 🥠
尽管它是基于C实现的,速度会快一些,但是,基于C环境依赖也是它的一大缺点,它的安装对于windows用户及不友好。而且对于python3.x不兼容
二.Mysqlclient
1.介绍
由于 MySQLdb 年久失修,后来出现了它的 Fork 版本 mysqlclient,完全兼容 MySQLdb,同时支持 Python3.x,是 Django ORM的依赖工具,如果你想使用原生 SQL 来操作数据库,那么推荐此驱动。Mysqlclient是一个C扩展模块,编译安装可能会导致报各种错误
2.安装
直接使用pip来安装
pip install mysqlclient
如果出错,可以查看这个文档 使用pip install mysqlclient命令安装mysqlclient失败?_D先生的博客-CSDN博客_mysqlclient
3.使用
虽然用pip安装的时候是mysqlclient,但是在python中使用的时候,仍然是用
import MySQLdb
具体的使用方法参照第一部分的介绍。
-
插入多条数据
import MySQLdb
# 注意 这里需要额外导入, 不然会报module 'MySQLdb' has no attribute 'cursors'的错误
import MySQLdb.cursors as cors
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8',
cursorclass=cors.DictCursor)
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql="insert into EMPLOYEE values(%s,%s,%s,%s)"
try:
# 执行sql语句
cursor.executemany(sql,[('Smith','Tom',15,'M',1500),('Mac', 'Mohan', 20, 'M', 2000)])
# 提交到数据库执行
dbmit()
except:
# Rollback in case there is any error
db.rollback()
# 关闭数据库连接
db.close()
推荐指数: 🥠🥠🥠🥠
Mysqlcliet安装较为方便,速度上比较快,支持gevent,兼容MySQLdb,对python3.x的用户很友好,流行度不如PyMySQL。
推荐指数: 🥠🥠🥠
这个包的安装总体来说算是顺利,它相当于python3.x的MySQLdb,速度比较快,但是操作不如
PyMySQL方便。
三.PyMySQL
1.介绍
PyMySQL是纯 Python 实现的驱动,速度上比不上 MySQLdb,最大的特点可能就是它的安装方式没那么繁琐,同时也兼容 MySQLdb。
这个链接里对于PyMySQL和MySQLdb做了一个比较。 mysqlclient vs PyMySQL | LibHunt
官网传送门: GitHub - PyMySQL/PyMySQL: Pure Python MySQL Client
2.安装
直接使用pip进行安装,基本不会报错。
pip install PyMySQL
3.使用
具体的使用几乎和MySQLdb差不多,只是在创建数据库连接的时候不同
-
创建数据库连接
import pymysql
# 打开数据库连接
db = pymsql.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8',
"cursorclass"= pymysql.cursors.DictCursor)
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 执行完毕后返回的结果默认以元组显示
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()
print "Database version : %s " % data
# 关闭数据库连接
db.close()
-
推荐指数: 🥠🥠🥠🥠
PymySQL安装很方便,由于它是用纯Python实现的,速度上会不如Mysqlclient,可以很好的跟gevent框架结合
在python3下对pymysql和mysqlclient做性能测试, 以十万条数据为基准:
mysql终端直接执行:
# 测试语句:
select * from tb1
结果:
100000 rows in set (0.05 sec)
python程序测试两个mysql模块,需安装profilehooks进行调用耗时分析
pip install profilehooks
pymysql模块性能测试:
# pymysql驱动测试程序:
# 安装:pip install pymysql
import pymysql
from profilehooks import timecall # timecall,提供了函数执行时间。
connection = pymysql.connect(host='localhost', user='root', password='123456',
database='test', port=3306, charset='utf8')
pymysql_cor = connection.cursor()
@timecall
def read_by_pymysql():
pymysql_cor.execute("select * from tb1;")
pymysql_cor.fetchall()
read_by_pymysql()
结果:
read_by_pymysql (D:/pythonproject/train1/pymysql_test.py:21):
0.922 seconds
分析结果:耗时0.922s,与原始mysql读取差一个数量级
mysqlclient模块性能测试:
#mysqlclient驱动测试程序:
# 安装:pip install mysqlclient 或 pip install git+https://github/PyMySQL/mysqlclient-python.git
import MySQLdb
# import MySQLdb.cursors as cors
from profilehooks import timecall
connection = pymysql.connect(host='localhost', user='root', password='123456',
database='test', port=3306, charset='utf8')
mysqlclient_cor = connection.cursor()
@timecall
def read_by_mysqlclient():
mysqlclient_cor.execute("select * from tb1;")
mysqlclient_cor.fetchall()
read_by_mysqlclient()
结果:
read_by_mysqlclient (D:/pythonproject/train1/mysqlclient_test.py:19):
0.090 seconds
分析结果:耗时0.090s, 和mysql直接执行基本在同一量级
四. 异同点及选择
pymysql 和 mysqlclient 目前是python连接mysql 的主流方式。
同:两个库的作者是同一个人INADA Naoki,pip库邮箱都指向mailto:songofacandy@gmail
异:mysqlclient 速度比pymysql 更快;pymysql更加简单易使用。
一般要选择 mysqlclient,除非以下三种情况:
1)你不能用mysqlclient出于某种原因
2)你想使用gevent or eventlet 配合
3) 考虑mysql协议兼容性
原文是这样的:
mysqlclient-python is much faster than PyMySQL.
When to use PyMySQL is:
You can't use libmysqlclient for some reason
You want to use monkeypatched socket of gevent or eventlet
You wan't to hack mysql protocol
上面的原因,导致目前使用pymysql的程序员远超过mysqlclient,特别是第二条,现在的python站点,基本都要用gevent或者eventlet。
目前虽然mysqlclient也可以兼容gevent,但还是存在一些的问题,具体看这篇文章:Python mysqlclient Doesn't Work Well with gevent // Overthought - Carson Ip
目前,大多开发人员选择了简单易用但是性能较差的pymysql。pymysql比mysqlclient慢许多,如果是大型项目,当然是用mysqlclient,该驱动性能比较优异、中小项目是用pymysql就可以了,毕竟是使用Python写的,契合度更高。
结论:对性能有较高的要求,推荐使用mysqlclient,如果对性能无所谓,没什么要求,pymysql是一个更不错的选择。
总结:
通过查阅资料,发现不管使用哪种驱动,其实对于数据库的操作都大同小异,不同之处在于数据库的连接操作不同。本文整理了他们执行增删查改的具体写法。他们都支持原生SQL语句。但是, 写原生 SQL 的过程非常繁琐,代码重复,没有面向对象思维,继而诞生了很多封装 wrapper 包和 ORM 框架( 框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
ORM 是 Python 对象与数据库关系表的一种映射关系,有了 ORM 你不再需要写 SQL 语句。提高了写代码的速度,同时兼容多种数据库系统,如sqlite, mysql、postgresql,peewee,SQLAlchemy,它们付出的代价可能就是性能上的一些损失 。
更多推荐
MySQLdb、Mysqlclient、PyMySQL 三个python的MySQL库的比较和总结
发布评论