前言
在学习python操作Mysql数据库时,发现操作数据库的工具包有很多种,这激发了我的兴趣。在查阅资料的过程程中,我发现,关于这些库的使用,并没有一个系统完整的整理,关于这些库的性能、上手难度的研究,也很少。由此,便有了下面的这篇笔记。
在实操之前,确保自己已经安装好了Mysql,并且开启了Mysql服务。如果要在命令行执行Mysql命令,需要在环境变量中写入bin目录的路径
MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 最流行的一个驱动,很多框架都也是基于此库进行开发,遗憾的是它只支持 Python2.x,而且安装的时候有很多前置条件,因为它是基于C开发的库,在 Windows 平台安装非常不友好,经常出现失败的情况,现在基本不推荐使用,取代的是它的衍生版本。
由于本机是python3.7的环境,无法直接安装MySQLdb,因此选择放弃。但可以考虑装 Mysqlclient。
资料传送门: 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()
推荐指数:
尽管它是基于C实现的,速度会快一些,但是,基于C环境依赖也是它的一大缺点,它的安装对于windows用户及不友好。而且对于python3.x不兼容
由于 MySQLdb 年久失修,后来出现了它的 Fork 版本 mysqlclient,完全兼容 MySQLdb,同时支持 Python3.x,是 Django ORM的依赖工具,如果你想使用原生 SQL 来操作数据库,那么推荐此驱动。Mysqlclient是一个C扩展模块,编译安装可能会导致报各种错误
直接使用pip来安装
pip install mysqlclient
如果出错,可以查看这个文档 https://blog.csdn.net/cn_1937/article/details/81533544
虽然用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()
推荐指数:
Mysqlcliet安装较为方便,速度上比较快,支持gevent,兼容MySQLdb,对python3.x的用户很友好,流行度不如PyMySQL。
推荐指数:
这个包的安装总体来说算是顺利,它相当于python3.x的MySQLdb,速度比较快,但是操作不如
PyMySQL方便。目前,Mysqlclient也可以使用gevent。
PyMySQL是纯 Python 实现的驱动,速度上比不上 MySQLdb,最大的特点可能就是它的安装方式没那么繁琐,同时也兼容 MySQLdb。
这个链接里对于PyMySQL和MySQLdb做了一个比较。 https://python.libhunt.com/compare-mysqlclient-python-vs-pymysql
官网传送门: https://github.com/PyMySQL/PyMySQL
直接使用pip进行安装,基本不会报错。
pip install PyMySQL
具体的使用几乎和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()
推荐指数:
PymySQL安装很方便,由于它是用纯Python实现的,速度上会不如Mysqlclient,PymySQL支持gevent
mysql-connector 是 MySQL 官方提供的驱动器。
安装的命令有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
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, "记录插入成功。")
推荐指数:
mysql-connector-python目前使用的人比较少,官方提供的资料也比较少,安装较为容易。性能暂时未测试。
通过查阅资料,发现不管使用哪种驱动,其实对于数据库的操作都大同小异,不同之处在于数据库的连接操作不同。本文整理了他们执行增删查改的具体写法。他们都支持原生SQL语句。但是, 写原生 SQL 的过程非常繁琐,代码重复,没有面向对象思维,继而诞生了很多封装 wrapper 包和 ORM 框架( 框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。 )。
ORM 是 Python 对象与数据库关系表的一种映射关系,有了 ORM 你不再需要写 SQL 语句。提高了写代码的速度,同时兼容多种数据库系统,如sqlite, mysql、postgresql,peewee,SQLAlchemy,它们付出的代价可能就是性能上的一些损失。接下来会写一篇文章来介绍这些轻量级ORM框架。
至于上面4种Mysql驱动,推荐顺序依次是:
Mysqlclient 》》》PyMysql 》》mysql.connector