1. 前言

在爬虫、自动化、数据分析、软件测试、Web 等日常操作中,除 JSON、YAML、XML 外,还有一些数据经常会用到,比如:Mysql、Sqlite、Redis、MongoDB、Memchache 等

一般情况下,我们都会使用特定的客户端或命令行工具去操作;但是如果涉及到工程项目,将这部分数据操作集成到代码中使用才是王道

接下来,我将分几篇文章,和大家一起聊聊 Python 操作这些数据的 最优 方案

本篇从使用最为广泛的关系型数据库 - Mysql 开始讲起

2. 准备

首先,我们通过 Mysql 客户端或命令行创建一个数据库 xh

然后,在这个数据库下建一张简单的表 people

为了便于演示,这里只创建了三个字段:id、name、age,其中 id 为主键

Python 操作 Mysql 主要包含下面 3 种方式:

  • Python-MySql

  • PyMysql

  • SQLAlchemy

其中,

Python-MySql 由 C 语法打造,接口精炼,性能最棒;但是由于环境依赖多,安装复杂,已停止更新,仅支持 Python2

PyMysql 为替代 Python-Mysql 而生,纯 Python 语言编写的 Mysql 操作客户端,安装方便,支持 Python3

SQLAlchemy 是一个非常强大的 ORM 框架,不提供底层的数据库操作,主要是通过定义模型对应数据表结构,在 Python Web 编程领域应用广泛

由于 Python-MySql  不支持 Python3,所以本文只谈后 2 种操作方式

3. PyMysql

首先,使用 pip 安装依赖

# 安装依赖
pip3 install pymysql

连接数据库,获取数据库连接对象及游标对象

使用 pymysql 中的 connect() 方法,传入数据库的 HOST 地址、端口号、用户名、密码、待操作数据库的名称,即可以获取 数据库的连接对象

然后,再通过数据库连接对象,获取执行数据库具体操作的 游标对象

import pymysql

# 数据库连接
self.db = pymysql.connect(host='localhost',
port=3306,
user='root',
password='**',
database='xh') # 获取游标
self.cursor = self.db.cursor()

接着,我们来实现增删改查操作

1、新增

新增包含新增单条数据和多条数据

对于单条数据的插入,只需要编写一条插入的 SQL 语句,然后作为参数执行上面游标对象的 execute(sql) 方法,最后使用数据库连接对象的 commit() 方法将数据提交到数据库中

# 插入一条数据
SQL_INSERT_A_ITEM = "INSERT INTO PEOPLE(name,age) VALUES('xag',23);" def insert_a_item(self):
"""
插入一条数据
:return:
"""
try:
self.cursor.execute(SQL_INSERT_A_ITEM)
self.db.commit()
except Exception as e:
print('插入数据失败')
print(e)
self.db.rollback()

使用执行游标对象的 executemany() 方法,传入插入的 SQL 语句及 位置变量列表,可以实现一次插入多条数据

# 插入多条数据SQL,name和age是变量,对应列表
SQL_INSERT_MANY_ITEMS = "INSERT INTO PEOPLE (name, age) VALUES(%s, %s)" # 待插入的数据
self.datas = [("张三", 23), ("李四", 24), ("王五", 25)] def insert_items(self):
"""
插入多条记录
:return:
"""
try:
self.cursor.executemany(SQL_INSERT_MANY_ITEMS, self.datas)
self.db.commit()
except Exception as e:
print("插入数据异常")
self.db.rollback()

需要注意的是,PyMysql 会将 SQL 语句中的所有字段当做字符串进行处理,所以这里的 age 字段在 SQL 中被当做字符串处理

2、查询

查询分为三步,分别是:

  • 通过游标对象执行具体的 SQL 语句

  • 通过游标对象,获取到元组数据

  • 遍历元组数据,查看结果

比如:查看数据表中所有的记录

# 查询所有记录
SQL_QUERY_ALL = "SELECT * FROM PEOPLE;" def query(self):
"""查询数据"""
# 查询所有数据
self.cursor.execute(SQL_QUERY_ALL) # 元组数据
rows = self.cursor.fetchall() # 打印结果
for row in rows:
id = row[0]
name = row[1]
age = row[2]
print('id:', id, ',name:', name, 'age:', age)

如果需要按条件查询某一条记录,只需要修改 SQL 语句即可实现

# 按id查询
SQL_QUERY_WITH_CONDITION = "SELECT * FROM PEOPLE WHERE id={};" # 查询id为5的记录
self.cursor.execute(SQL_QUERY_WITH_CONDITION.format(5))

3、更新

和 新增操作 类似,更新操作也是通过游标对象去执行更新的 SQL 语句,最后利用数据库连接对象将数据真实更新到数据库中

# 更新(通过id去更新)
SQL_UPDATE = "UPDATE PEOPLE SET name='%s',age=%s WHERE id=%s" def update(self):
"""
更新数据
:return:
"""
sql_update = SQL_UPDATE % ("王五五", 30, 5)
print(sql_update) try:
self.cursor.execute(sql_update)
self.db.commit()
except Exception as e:
self.db.rollback()
print('更新数据异常')
print(e)

4、删除

删除操作同查询、新增操作类似,只需要变更 SQL 语句即可

# 删除(通过id去删除数据)
SQL_DELETE = "DELETE FROM PEOPLE WHERE id=%d"

def delete(self):
"""
删除记录
:return:
"""
try:
# 删除的完整sql
sql_del = SQL_DELETE % (5)
self.cursor.execute(sql_del)
self.db.commit()
except Exception as e:
# 发生错误时回滚
self.db.rollback()
print(e)

最后,我们需要将游标对象和数据库连接对象资源释放掉

def teardown(self):
# 释放资源
self.cursor.close()
self.db.close()

4. SQLAlchemy

首先,使用 SQLAlchemy 操作 Mysql 数据库同样先需要安装依赖库

# 安装依赖包
pip3 install sqlalchemy

通过 SQLAlchemy 的内置方法 declarative_base() 创建一个基础类 Base

然后,自定义一个 Base 类的子类,内部定义静态变量,和上面数据表 people 中的字段一一对应

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base # 基础类
Base = declarative_base() # 自定义的表
class People(Base):
# 表名
__tablename__ = 'people' # 定义字段
id = Column(Integer, primary_key=True)
name = Column(String(255))
age = Column(Integer) def __repr__(self):
"""
便于打印结果
:return:
"""
return "<People(id:{},name:{},age:{})".format(self.id, self.name, self.age)

接着,通过数据库名、用户名、密码及 Host 组装一个数据库连接地址,作为参数传入到 SQLAlchemy 的 create_engine() 方法中,以创建一个数据库引擎实例对象

# 创建数据库的引擎实例对象
# 数据库名称:xh
engine = create_engine("mysql+pymysql://root:数据库密码@localhost:3306/xh",
encoding="utf-8",
echo=True)

最后,通过数据库引擎在数据库中创建表结构,并实例化一个 会话对象

需要注意的是,create_all() 方法中的 checkfirst 参数如果传入 True,则会判断数据表是否存在,如果表存在,则不会重新创建

# 创建表结构
# checkfirst:判断表是否存在,如果存在,就不重复创建
Base.metadata.create_all(engine, checkfirst=True) # 实例化会话
self.session = sessionmaker(bind=engine)()

这样所有的准备工作已经完成,接下来可以进行增删改查操作了

1、新增

新增操作同样包含插入一条记录和多条记录,分别对应会话对象的 add()、add_all() 方法

对于一条记录的新增操作,只需要实例化一个 People 对象,执行上面的会话对象的 add(instance) 和 commit() 两个方法,即可以将数据插入到数据表中

def add_item(self):
"""
新增
:return:
"""
# 实例化一个对象
people = People(name='xag', age=23)
self.session.add(people) # 提交数据才会生效
self.session.comit()

如果需要一次插入多条数据,只需要调用 add_all(列表数据) 即可

def add_items(self):
"""
新增多条记录
:return:
"""
datas = [
People(name='张三', age=20),
People(name='李四', age=21),
People(name='王五', age=22),
]
self.session.add_all(datas) self.session.commit()

2、查询

查询数据表的操作对应会话对象的 query(可变参数)

方法中的参数指定要查询的字段值,还可以通过 all()、first() 级联方法限制要查询的数据

def query(self):
"""
查询
:return:
"""
# 查询所有记录
# result = self.session.query(People).all() # 查询name/age两个字段
result = self.session.query(People.name, People.age).all()
print(result)

当然,也可以利用 filter_by(条件),按条件进行过滤

# 条件查询
resp = self.session.query(People).filter_by(name='xag').first()
print(resp)

3、更新

更新操作一般做法是:

  • query 查询出待更新的对象

  • 直接更新对象中的数据

  • 使用会话对象提交修改,完成更新操作

​def update1(self, id):
"""
更新数据1
:return:
"""
# 获取数据
temp_people = self.session.query(People).filter_by(id=id).first() # 更新数据
temp_people.name = "星安果"
temp_people.age = 18
# 提交修改
self.session.commit()

需要指出的是,这里可以使用 update() 方法进行简写

​def update2(self, id):
"""
更新数据2
:param id:
:return:
"""
# 使用update()方法直接更新字段值
self.session.query(People).filter(People.id == id).update({People.name: "xag", People.age: 1})
self.session.commit()

4、删除

删除操作对应 delete() 方法,同样是先查询,后删除,最后提交会话完成删除操作

以按照 id 删除某一条记录为例:

def del_by_id(self, id):
"""
通过id删除一条记录
:param id:
:return:
"""
del_count = self.session.query(People).filter(People.id == id).delete()
print('删除数目:', del_count)
self.session.commit()

5.最后

本篇文章通过一张表的增删改查,详细讲解了 Python 操作 Mysql 的两种使用方式

在实际项目中,如果仅仅是简单的爬虫或者自动化,建议使用 PyMysql;否则建议直接上 SQLAlchemy,它更强大方便

我已经将文中全部源码上传到后台,关注公众号「 AirPython 」后回复「 dball 」即可获得全部源码

如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

推荐阅读

带你用 Python 实现自动化群控(入门篇)

Python 如何使用 HttpRunner 做接口自动化测试

Python 自动化,Helium 凭什么取代 Selenium?

最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)的更多相关文章

  1. 最全总结 | 聊聊 Python 数据处理全家桶(PgSQL篇)

    1. 前言 大家好,我是安果! Python 数据处理全家桶,截止到现在,一共写过 6 篇文章,有兴趣的小伙伴可以去了解一下! 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇) 最全 ...

  2. 最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)

    1. 前言 上篇文章 聊到 Python 处理 Mysql 数据库最常见的两种方式,本篇文章继续说另外一种比较常用的数据库:Sqlite Sqlite 是一种 嵌入式数据库,数据库就是一个文件,体积很 ...

  3. 最全总结 | 聊聊 Python 数据处理全家桶(Redis篇)

    1. 前言 前面两篇文章聊到了 Python 处理 Mysql.Sqlite 数据库常用方式,本篇文章继续说另外一种比较常用的数据存储方式:Redis Redis:Remote Dictionary ...

  4. 最全总结 | 聊聊 Python 数据处理全家桶(Memcached篇)

    1. 前言 本篇文章继续继续另外一种比较常用的数据存储方式:Memcached Memcached:一款高性能分布式内存对象缓存系统,通过 内存缓存,以减少数据库的读取,从而分担数据库的压力,进而提高 ...

  5. 最全总结 | 聊聊 Python 数据处理全家桶(配置篇)

    1.前言 在实际项目中,经常会接触到各种各样的配置文件,它可以增强项目的可维护性 常用配件文件的处理方式,包含:JSON.ini / config.YAML.XML 等 本篇文章,我们将聊聊 Pyth ...

  6. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  7. 最全总结 | 聊聊 Python 办公自动化之 Excel(上)

    1. 前言 在我们日常工作中,经常会使用 Word.Excel.PPT.PDF 等办公软件 但是,经常会遇到一些重复繁琐的事情,这时候手工操作显得效率极其低下:通过 Python 实现办公自动化变的很 ...

  8. 最全总结 | 聊聊 Python 办公自动化之 Excel(下)

    1. 前言 前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt.openpyxl ​其中, xlrd/xlwt 这一组合,xlrd 可以负责读取数据,而 xlwt ...

  9. 最全总结 | 聊聊 Python 办公自动化之 Word(上)

    1. 前言 日常自动化办公中,使用 Python 真的能做到事半功倍! 在上一个系列中,我们对 Python 操作 Excel 进行了一次全面总结 最全总结 | 聊聊 Python 办公自动化之 Ex ...

随机推荐

  1. 实战分享丨MySQL 与Django版本匹配相关经验

    摘要:关于MySQL 与Django版本匹配相关知识的经验分享. run: (env) E:\PythonPro\PyDjangoProDemo011\xuanyuaniotpro>python ...

  2. Unix I/O

    Unix I/O 打开文件 一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备.内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件.内核记录有关这个打开 ...

  3. PC,移动端H5实现实现小球加入购物车效果

    HTML部分: <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" ...

  4. Hyperledger Fabric 手动搭建【区块链学习三】

    Hyperledger Fabric 手动搭建 前面我们学习了区块链是什么.还有自动搭建学习东西我们就要从简单到深入(入门到放弃),现在自动部署已经跑通了接下来就是手动搭建Fabric 网络可以更好的 ...

  5. 操作系统-文件系统(3)Linux目录配置

    文件系统通常采用分层结构实现:文件管理.目录管理.磁盘管理 文件控制块(File Control Block,FCB)是操作系统为每个文件建立的唯一数据结构,包含了全部文件属性. 通常把FCB汇集.组 ...

  6. 第1篇 Scrum冲刺博客

    一.Alpha阶段各成员任务 梁天龙 任务名称 预计工时  编辑历史记录  2  登陆按键设计  3  考勤记录页面 2  人数记录页面  2  学习课程页面 4  建议页面  2 黄岳康 任务名称 ...

  7. Solr的原理及使用

    1.Solr的简介Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过 ...

  8. Spring Cloud Config整合Spring Cloud Kubernetes,在k8s上管理配置

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Kubernetes有专门的ConfigMap和Secret来管理配置,但它也有一些局限性,所以还是希望通过Spring C ...

  9. AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)

    题目地址:https://www.acwing.com/problem/content/244/ 题目描述: 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d ...

  10. 求求大厂给个Offer:Map面试题

    前言 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文章,最近在连载面试系列! 我,三歪,最近开始写面试系列.我给这个面试系列 ...