MySQLdb、Mysqlclient、PyMySQL、mysql.connector用法总结和比较

前言
在学习python操作Mysql数据库时,发现操作数据库的工具包有很多种,这激发了我的兴趣。在查阅资料的过程程中,我发现,关于这些库的使用,并没有一个系统完整的整理,关于这些库的性能、上手难度的研究,也很少。由此,便有了下面的这篇笔记。

目录

  • 一.MySQLdb
    • 1.介绍
    • 2.安装
    • 3.使用
    • 4.评价
  • 二.Mysqlclient
    • 1.介绍
    • 2.安装
    • 3.使用
    • 4.评价
  • 三.PyMySQL
    • 1.介绍
    • 2.安装
    • 3.使用
    • 4.评价
  • 四.mysql.connector
    • 1.介绍
    • 2.安装
    • 3.使用
    • 4.评价
  • 总结:
  • 参考文档

在实操之前,确保自己已经安装好了Mysql,并且开启了Mysql服务。如果要在命令行执行Mysql命令,需要在环境变量中写入bin目录的路径

一.MySQLdb

1.介绍

MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 最流行的一个驱动,很多框架都也是基于此库进行开发,遗憾的是它只支持 Python2.x,而且安装的时候有很多前置条件,因为它是基于C开发的库,在 Windows 平台安装非常不友好,经常出现失败的情况,现在基本不推荐使用,取代的是它的衍生版本。

2.安装

由于本机是python3.7的环境,无法直接安装MySQLdb,因此选择放弃。但可以考虑装 Mysqlclient。

3.使用

资料传送门: https://www.runoob.com/python/python-mysql.html

⚠注意事项⚠

当前建立了一个名为TESTDB的数据库,数据库中有一张名为 EMPLOYEE的 表,字段如下:

FIRST_NAME LAST_NAME AGE SEX INCOME

接数据库TESTDB使用的用户名为 “testuser” ,密码为 “test123”

下面将介绍数据库的几种常见操作,具体包括数据库连接,建表,以及对表中数据的增删改查。

建立数据库连接

import MySQLdb 
# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# 使用execute方法执行SQL语句 
cursor.execute("SELECT VERSION()") 
# 使用 fetchone() 方法获取一条数据 
data = cursor.fetchone() 
print "Database version : %s " % data 
# 关闭数据库连接 
db.close() 

创建数据库表

import MySQLdb 
# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# 如果数据表已经存在使用 execute() 方法删除表。 
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") 
# 创建数据表SQL语句 
sql = """CREATE TABLE EMPLOYEE ( 
         FIRST_NAME  CHAR(20) NOT NULL, 
         LAST_NAME  CHAR(20), 
         AGE INT,   
         SEX CHAR(1), 
         INCOME FLOAT )""" 
cursor.execute(sql) 
# 关闭数据库连接 
db.close() 

插入数据操作

import MySQLdb 
# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# SQL 插入语句 
sql = """INSERT INTO EMPLOYEE(FIRST_NAME, 
         LAST_NAME, AGE, SEX, INCOME) 
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" 
          
#SQL语句也可以这样写,使用%占位符 
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ 
       LAST_NAME, AGE, SEX, INCOME) \ 
       VALUES (%s, %s, %s, %s, %s )" % \ 
       ('Mac', 'Mohan', 20, 'M', 2000)  
try: 
   # 执行sql语句 
   cursor.execute(sql) 
   # 提交到数据库执行 
   db.commit() 
except: 
   # Rollback in case there is any error 
   db.rollback() 
# 关闭数据库连接 
db.close() 

数据查询操作

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

方法名 作用
fetchone() 该方法获取下一个查询结果集。结果集是一个对象
fetchall() 接收全部的返回结果行.
rowcount 这是一个只读属性,并返回执行execute()方法后影响的行数。

【Example】 查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:

import MySQLdb 
# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# SQL 查询语句 
sql = "SELECT * FROM EMPLOYEE \ 
       WHERE INCOME > %s" % (1000) 
try: 
   # 执行SQL语句 
   cursor.execute(sql) 
   # 获取所有记录列表 
   results = cursor.fetchall() 
   for row in results: 
      fname = row[0] 
      lname = row[1] 
      age = row[2] 
      sex = row[3] 
      income = row[4] 
      # 打印结果 
      print "fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \ 
             (fname, lname, age, sex, income ) 
except: 
   print "Error: unable to fecth data" 
# 关闭数据库连接 
db.close() 

数据库更新操作

import MySQLdb 
# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# SQL 更新语句 
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') 
try: 
   # 执行SQL语句 
   cursor.execute(sql) 
   # 提交到数据库执行 
   db.commit() 
except: 
   # 发生错误时回滚 
   db.rollback() 
# 关闭数据库连接 
db.close() 

删除操作

import MySQLdb 
# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# SQL 删除语句 
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20) 
try: 
   # 执行SQL语句 
   cursor.execute(sql) 
   # 提交修改 
   db.commit() 
except: 
   # 发生错误时回滚 
   db.rollback() 
# 关闭连接 
db.close() 

4.评价

推荐指数:

尽管它是基于C实现的,速度会快一些,但是,基于C环境依赖也是它的一大缺点,它的安装对于windows用户及不友好。而且对于python3.x不兼容

二.Mysqlclient

1.介绍

由于 MySQLdb 年久失修,后来出现了它的 Fork 版本 mysqlclient,完全兼容 MySQLdb,同时支持 Python3.x,是 Django ORM的依赖工具,如果你想使用原生 SQL 来操作数据库,那么推荐此驱动。Mysqlclient是一个C扩展模块,编译安装可能会导致报各种错误

2.安装

直接使用pip来安装

pip install mysqlclient

如果出错,可以查看这个文档 https://blog.csdn.net/cn_1937/article/details/81533544

3.使用

虽然用pip安装的时候是mysqlclient,但是在python中使用的时候,仍然是用

import MySQLdb 

具体的使用方法参照第一部分的介绍。

  • 插入多条数据
import MySQLdb 
# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用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() 

4.评价

推荐指数:

Mysqlcliet安装较为方便,速度上比较快,支持gevent,兼容MySQLdb,对python3.x的用户很友好,流行度不如PyMySQL。

推荐指数:

这个包的安装总体来说算是顺利,它相当于python3.x的MySQLdb,速度比较快,但是操作不如

PyMySQL方便。目前,Mysqlclient也可以使用gevent。

三.PyMySQL

1.介绍

PyMySQL是纯 Python 实现的驱动,速度上比不上 MySQLdb,最大的特点可能就是它的安装方式没那么繁琐,同时也兼容 MySQLdb。

这个链接里对于PyMySQL和MySQLdb做了一个比较。 https://python.libhunt.com/compare-mysqlclient-python-vs-pymysql

官网传送门: https://github.com/PyMySQL/PyMySQL

2.安装

直接使用pip进行安装,基本不会报错。

pip install PyMySQL

3.使用

具体的使用几乎和MySQLdb差不多,只是在创建数据库连接的时候不同

  • 创建数据库连接
import pymysql 
# 打开数据库连接 
db = pymsql.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# 执行完毕后返回的结果默认以元组显示 
# 使用execute方法执行SQL语句 
cursor.execute("SELECT VERSION()") 
# 使用 fetchone() 方法获取一条数据 
data = cursor.fetchone() 
print "Database version : %s " % data 
# 关闭数据库连接 
db.close() 

4.评价

推荐指数:

PymySQL安装很方便,由于它是用纯Python实现的,速度上会不如Mysqlclient,PymySQL支持gevent

四.mysql.connector

1.介绍

mysql-connectorMySQL 官方提供的驱动器。

2.安装

安装的命令有2种

# 方法一 
python -m pip install mysql-connector 
# 方法二 
pip install mysql-connector-python 
下载过程中,可能会出现超时问题,可以在命令后面添加国内镜像 

如:

pip install mysql-connector-python -i https://pypi.tuna.tsinghua.edu.cn/simple 

进入cmd,输入python,使用以下代码测试 mysql-connector 是否安装成功:

import mysql.connector 

3.使用

mysql.connector的用法和上述3个库大致相同,这里只展示出几种不同的写法。

  • 创建数据库连接
import mysql.connector 
  
mydb = mysql.connector.connect( 
  host="localhost",       # 数据库主机地址 
  user="root",    # 数据库用户名 
  passwd="000000"# 数据库密码 
  database="TESTDB" 
) 

写法2:

import mysql.connector 
config = {
      
      'user': 'root', 
      'password': '000000', 
      'host': 'localhost', 
      'database': 'TESTDB', 
      'charset': 'utf8', 
      "connection_timeout": 5, 
      "use_pure": True 
} 
cnx = mysql.connector.connect(**config)   # 建立连接 
# 上面的几个驱动也都支持这样的写法 
cursor = cnx.cursor(dictionary=True) 
  • 插入单条数据
import mysql.connector 
config = {
      
      'user': 'root', 
      'password': '000000', 
      'host': 'localhost', 
      'database': 'TESTDB', 
      'charset': 'utf8', 
      "connection_timeout": 5, 
      "use_pure": True 
} 
cnx = mysql.connector.connect(**config)   # 建立连 
mycursor = cnx.cursor() 
  
sql = "insert into EMPLOYEE values(%s,%s,%s,%s)" 
val = ('Smith','Tom',15,'M',1500) 
mycursor.execute(sql, val) 
  
mydb.commit()    # 数据表内容有更新,必须使用到该语句 
  
print(mycursor.rowcount, "记录插入成功。") 
  • 批量插入数据
import mysql.connector 
config = {
      
      'user': 'root', 
      'password': '000000', 
      'host': 'localhost', 
      'database': 'TESTDB', 
      'charset': 'utf8', 
      "connection_timeout": 5, 
      "use_pure": True 
} 
cnx = mysql.connector.connect(**config)   # 建立连 
mycursor = cnx.cursor() 
sql = "insert into EMPLOYEE values(%s,%s,%s,%s)" 
val = [('Smith','Tom',15,'M',1500),('Mac', 'Mohan', 20, 'M', 2000)] 
  
mycursor.executemany(sql, val) 
  
mydb.commit()    # 数据表内容有更新,必须使用到该语句 
  
print(mycursor.rowcount, "记录插入成功。") 

4.评价

推荐指数:

mysql-connector-python目前使用的人比较少,官方提供的资料也比较少,安装较为容易。性能暂时未测试。

总结:

通过查阅资料,发现不管使用哪种驱动,其实对于数据库的操作都大同小异,不同之处在于数据库的连接操作不同。本文整理了他们执行增删查改的具体写法。他们都支持原生SQL语句。但是, 写原生 SQL 的过程非常繁琐,代码重复,没有面向对象思维,继而诞生了很多封装 wrapper 包和 ORM 框架( 框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。 )。

ORM 是 Python 对象与数据库关系表的一种映射关系,有了 ORM 你不再需要写 SQL 语句。提高了写代码的速度,同时兼容多种数据库系统,如sqlite, mysql、postgresql,peewee,SQLAlchemy,它们付出的代价可能就是性能上的一些损失。接下来会写一篇文章来介绍这些轻量级ORM框架。

至于上面4种Mysql驱动,推荐顺序依次是:

Mysqlclient 》》》PyMysql 》》mysql.connector

参考文档

  1. Python操作Mysql的5种方式
  2. python在windows环境中安装MySQLdb
  3. python操作mysql数据库
  4. PyMySQL基本使用
  5. 使用python操作mysql数据库
  6. Python3 MySQL 数据库连接 - PyMySQL 驱动
  7. Python MySQL - mysql-connector 驱动
  8. python——Mysql操作,使用mysql.connector

你可能感兴趣的:(python学习,mysql,sql,python)