数据库操作之python连接mysql的四种方式、pymysql操作数据库、事务

1. 数据库的介绍(了解)

介绍: 数据库是存放数据的仓库,按照一定的数据结构来组织、存储和管理数据

分类: 关系型数据库和非关系型数据库

  • 关系型数据库:Mysql、Oracle、SQL Server、SQLite
  • 非关系数据库:Redis、MongoDB、NoSQL

2. Python连接Mysql数据库的几种方式(了解)

  • MysqlDB
    • 是python2.x连接数据库的工具,曾使用非常广泛
    • 现在由于进入了python3.x时代,基本已经废弃了
  • MysqlClient
    • 是mysqldb的衍生版本,兼容mysqldb
    • 是django的orm映射工具
  • PyMysql
    • 是一个纯Python开发的工具,也兼容mysqldb
    • 使用简单,功能强大
  • SQLAlChemy
    • 是一个即支持纯sql语言,也支持ORM映射的工具

3. PyMysql安装

输入命令:pip install pymysql

Pymysql操作数据库的流程图:

在这里插入图片描述

CREATE DATABASE IF NOT EXISTS books default charset utf8;
USE books;
DROP TABLE IF EXISTS `t_book`;
CREATE TABLE `t_book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(20) NOT NULL COMMENT '图书名称',
`pub_date` date NOT NULL COMMENT '发布日期',
`read` int(11) NOT NULL DEFAULT '0' COMMENT '阅读量',
`comment` int(11) NOT NULL DEFAULT '0' COMMENT '评论量',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='图书表';
INSERT INTO `t_book` VALUES ('1', '射雕英雄传', '1980-05-01', '12', '34', '0');
INSERT INTO `t_book` VALUES ('2', '天龙八部', '1986-07-24', '36', '40', '0');
INSERT INTO `t_book` VALUES ('3', '笑傲江湖', '1995-12-24', '20', '80', '0');
DROP TABLE IF EXISTS `t_hero`;
CREATE TABLE `t_hero` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '姓名',
`gender` smallint(6) NOT NULL COMMENT '性别',
`description` varchar(200) DEFAULT NULL COMMENT '描述',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
`book_id` int(11) NOT NULL COMMENT '所属图书ID',
PRIMARY KEY (`id`),
KEY `t_hero_book_id` (`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='英雄人物表';
INSERT INTO `t_hero` VALUES ('1', '郭靖', '1', '降龙十八掌', '0', '1');
INSERT INTO `t_hero` VALUES ('2', '黄蓉', '0', '打狗棍法', '0', '1');
INSERT INTO `t_hero` VALUES ('3', '乔峰', '1', '降龙十八掌', '0', '2');
INSERT INTO `t_hero` VALUES ('4', '令狐冲', '1', '独孤九剑', '0', '3');
INSERT INTO `t_hero` VALUES ('5', '任盈盈', '0', '弹琴', '0', '3');

游标

类似于指针,指针是指向数据的地址

在计算机中,我们获取数据不是直接获取的,而是通过地址获取,而指针就是指向地址的探头,通过指针,我们才能访问到具体的数据。

在这里插入图片描述

4. Pymysql操作数据库

建立连接

# 1 导包
import pymysql
# 2 建立数据库连接
conn = pymysql.connect(host='localhost', user='root', password='root', database='books', port=3306, autocommit=False)
# 3 获取游标
cursor = conn.cursor()
# 4 执行
# 查看数据库的版本
cursor.execute("select version();")
# 注意,使用游标执行sql语句之后,不会返回我们的执行结果,要返回执行结果,必须通过cursor.fetchone()或cursor.fetchall()的方式来获取
print("数据库版本号:", cursor.fetchone())
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()

查询

# 1 导包
import pymysql
# 2 建立连接
conn = pymysql.connect(host='localhost', user='root', password='root', database='books', port=3306)
# 3 获取游标
cursor = conn.cursor()
# 4 执行
# 查询图书表数据
select_sql = "select id, title, `read`, `comment` from t_book;"
cursor.execute(select_sql)
print("查询结果的总记录数为:", cursor.rowcount)
# 查询结果的第一条数据
print("查询结果的第一条数据为: {}".format(cursor.fetchone()))
# 获取全部的查询结果
# 注意:如果之前使用过fetchone或者fetchall,那么后续再使用fetchall时,会从上一个的指针位置读取数据
print("全部查询结果为:", cursor.fetchall())
# 要获取全部的查询结果,需要重新再执行查询语句
cursor.execute(select_sql)
# 再打印依次全部的结果
book_list = cursor.fetchall()
print("重新执行查询语句之后的结果为:", book_list)
# 打印每一本书
for book in book_list:
    print("书名为:", book[1])
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()

新增

# 通过pymysql完成操作mysql数据的本质是什么?
# 本质就是通过游标执行SQL语句,例如:cursor.execute(sql)
# 执行插入操作,本质上就是执行insert sql语句
# 所以我们可以先按照需求,把插入语句构造好,然后通过pymysql来执行

# 1 导包
import pymysql
# 2 建立连接
conn = pymysql.connect(host='localhost', user='root', password='root', database='books', port=3306, autocommit=True)
# 注意:如果不支持innoDb引擎,那么autocommit的设置不会生效,执行插入语句之后,会立刻把数据插入导数据库
# 3 获取游标
cursor = conn.cursor()
# 4 执行插入语句
insert_sql = "insert into t_book(id, title, pub_date) values(4, '三体','1970-01-01');"
cursor.execute(insert_sql)
# 查看执行结果
# 注意:写入语句不能通过fetchone和fetchall来查看
cursor.execute("select * from t_book;")
print("全部结果:", cursor.fetchall())
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()

修改

# 1 导包
import pymysql
# 2 建立连接
conn = pymysql.connect('localhost', 'root', 'root','books', autocommit=True)
# 3 获取游标
cursor = conn.cursor()
# 4 执行
# 需求:将"三体"的阅读量增1 `read`
update_sql = "update t_book set `read` = `read` + 1 where title='三体';"
cursor.execute(update_sql)
# 查看结果
cursor.execute("select * from t_book;")
print("所有书:", cursor.fetchall())
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()

删除

# 1 导包
import pymysql
# 2 建立连接
conn = pymysql.connect('localhost','root','root', 'books', autocommit=True)
# 3 获取游标
cursor = conn.cursor()
# 4 执行删除语句
# 需求:是删除'三体'这本书
delete_sql = 'delete from t_book where title="三体";'
cursor.execute(delete_sql)
# 查看删除结果
cursor.execute("select * from t_book;")
print("删除之后的结果: {}".format(cursor.fetchall()))
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()

5. 事务

并发控制的基本单元解释:

从客户端发起的接口请求,要完成的通过123456个流程,其中有一个流程出现问题,都会认为这个接口请求失败。只有全部成功,才算真正的成功。

在这里插入图片描述

转账流程图说明

银行之间的转账金额必须是固定值,不可减少。如果没有事务进行处理,那么一旦出现意外,会导致金钱无故消失,损伤个人和国家利益

在这里插入图片描述

事务的概念:

介绍: 事务是对一组工作序列的操作,这组操作要么全部成功,要么全部失败。

例子: 银行转行案例

特点(重点) :事务有4个特点(ACID)

原子性: 是指事务就像原子一样不可分割

一致性: 事务提交前后,数据的状态不会发生改变

隔离性(最难): 是指事务与事务之间不能相互干扰

持久性: 提交事务后,对数据状态的改变是永久性。

注意:使用事务的数据库,理论上只能够通过事务来改变数据。

数据库隔离性解释案例:

读已提交案例图:

在这里插入图片描述

数据库事务提交的机制:

自动提交:

  • 建立连接时通过,autocommit的值进行设置
  • 建立连接之后,通过conn.autocommit(True)进行设置

手动提交:

  • 指在未开启自动提交事务之前,可以使用手动提交事务
  • conn.commit() 提交事务
  • conn.rollback() 回滚事务

在这里插入图片描述

事务提交代码演示

# 导包
import pymysql
# 建立连接
conn = pymysql.connect("localhost", "root", "root", "books") # 注意,如果没有设置autocommit,那么自动提交事务是关闭状态
# 获取游标
cursor = conn.cursor()
# 执行语句
# 需求:1 新增一本书 2 新增这本书中的一个人物
# 新增一本书的SQL
add_book_sql = "insert into t_book(id, title, pub_date) values(4, '创新公司:皮克斯的启示','1970-01-01');"
# 新增一个人物的SQL
add_hero_sql = "insert into t_hero(id,`name`,`gender`,`book_id`) values(6,'乔布斯',1, 4);"
# 执行新增书和新增人物的SQL语句
cursor.execute(add_book_sql)
cursor.execute(add_hero_sql)
# 查看结果
cursor.execute("select * from t_book")
print("查看添加书之后的结果:", cursor.fetchall())
cursor.execute("select * from t_hero")
print("查看添加英雄人物之后的结果:", cursor.fetchall())
# 如果自动提交事务没有开启,那么需要手动提交事务,否则在代码中的操作不会真正的把数据提交到数据库
# 所以我们需要手动提交事务,提交方法就是:conn.commit()
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

事务回滚代码案例演示:

# 导包
import pymysql
conn, cursor = None, None
try:
    # 建立连接
    conn = pymysql.connect("localhost", "root", "root", "books")  # 注意,如果没有设置autocommit,那么自动提交事务是关闭状态
    # 获取游标
    cursor = conn.cursor()
    # 执行语句
    # 需求:1 新增一本书 2 新增这本书中的一个人物
    # 新增一本书的SQL
    add_book_sql = "insert into t_book(id, title, pub_date) values(5, '红楼梦','1970-01-01');"
    # 新增一个人物的SQL,构建异常:列数量和值数量不匹配
    add_hero_sql = "insert into t_hero(id,`name`,`gender`,`book_id`) values(1,7,'贾宝玉',1, 4);"
    # 执行新增书和新增人物的SQL语句
    cursor.execute(add_book_sql)
    cursor.execute(add_hero_sql)
    # 查看结果
    cursor.execute("select * from t_book")
    print("查看添加书之后的结果:", cursor.fetchall())
    cursor.execute("select * from t_hero")
    print("查看添加英雄人物之后的结果:", cursor.fetchall())
    # 如果自动提交事务没有开启,那么需要手动提交事务,否则在代码中的操作不会真正的把数据提交到数据库
    # 所以我们需要手动提交事务,提交方法就是:conn.commit()
    conn.commit()
except Exception as e:
    conn.rollback()
    print("已触发回滚操作!")
finally:
    # 关闭游标
    if cursor:
        cursor.close()
    # 关闭连接
    if conn:
        conn.close()

  • 13
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值