介绍: 数据库是存放数据的仓库,按照一定的数据结构来组织、存储和管理数据
分类: 关系型数据库和非关系型数据库
输入命令: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');
游标
类似于指针,指针是指向数据的地址
在计算机中,我们获取数据不是直接获取的,而是通过地址获取,而指针就是指向地址的探头,通过指针,我们才能访问到具体的数据。
建立连接
# 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()
并发控制的基本单元解释:
从客户端发起的接口请求,要完成的通过123456个流程,其中有一个流程出现问题,都会认为这个接口请求失败。只有全部成功,才算真正的成功。
转账流程图说明
银行之间的转账金额必须是固定值,不可减少。如果没有事务进行处理,那么一旦出现意外,会导致金钱无故消失,损伤个人和国家利益
事务的概念:
介绍: 事务是对一组工作序列的操作,这组操作要么全部成功,要么全部失败。
例子: 银行转行案例
特点(重点) :事务有4个特点(ACID)
原子性: 是指事务就像原子一样不可分割
一致性: 事务提交前后,数据的状态不会发生改变
隔离性(最难): 是指事务与事务之间不能相互干扰
持久性: 提交事务后,对数据状态的改变是永久性。
注意:使用事务的数据库,理论上只能够通过事务来改变数据。
数据库隔离性解释案例:
读已提交案例图:
数据库事务提交的机制:
自动提交:
手动提交:
事务提交代码演示
# 导包
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()