MySQLdb、Mysqlclient、PyMySQL 三个python的MySQL库的比较和总结

一.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)]) 
   # 提交到数据库执行 
   db.commit() 
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.com/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.com

异: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,它们付出的代价可能就是性能上的一些损失 。

  • 23
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Python链接MySQL驱动包,安装之后可以使用Python语言链接MySQL进行数据库操作 # mysqlclient [![Build Status](https://secure.travis-ci.org/PyMySQL/mysqlclient-python.png)](http://travis-ci.org/PyMySQL/mysqlclient-python) This is a fork of [MySQLdb1](https://github.com/farcepest/MySQLdb1). This project adds Python 3 support and bug fixes. I hope this fork is merged back to MySQLdb1 like distribute was merged back to setuptools. ## Install ### Prerequisites You may need to install the Python and MySQL development headers and libraries like so: `sudo apt-get install python-dev libmysqlclient-dev` # Debian / Ubuntu `sudo yum install python-devel mysql-devel` # Red Hat / CentOS On Windows, there are binary wheel you can install without MySQLConnector/C or MSVC. #### Note on Python 3 : if you are using python3 then you need to install python3-dev using the following command : `sudo apt-get install python3-dev` # debian / Ubuntu `sudo yum install python3-devel ` # Red Hat / CentOS `brew install mysql-connector-c` # macOS (Homebrew) ### Install from PyPI `pip install mysqlclient` NOTE: Wheels for Windows may be not released with source package. You should pin version in your `requirements.txt` to avoid trying to install newest source package. ### Install from source 1. Download source by `git clone` or [zipfile](https://github.com/PyMySQL/mysqlclient-python/archive/master.zip). 2. Customize `site.cfg` 3. `python setup.py install` ### Documentation Documentation is hosted on [Read The Docs](https://mysqlclient.readthedocs.io/)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值