数据库原理与应用 第 17 章 · 第六节
课程第 17 章第六节 查询数据取全部取一条执行事务四个属性两个方法全章小结 版式
第 17 章 使用 Python 连接 MySQL 数据库 · 第六节

查询、事务与全章小结

本 节 知 识 点
  1. 54第三块:SELECT 多一步
  2. 55示例 4:age 大于等于 20
  3. 56示例 5:只要第一条
  4. 57第四块:commit 和 rollback
  5. 58原子性、一致性、隔离性、持久性
  6. 59commit 提交,rollback 撤销
  7. 60五步、两个方法、三个 fetch
54
第 17 章 · 第六节

第三块:SELECT 多一步

查询比增删改多一步 fetch,少一步 commit。

第 54 页课件

重 点

多出来的那一步是 fetch,省掉的那一步是 commit。

分清楚两类语句

语句多什么少什么
增删改要 commit
查询要 fetch
55
第 17 章 · 第六节

示例 4:age 大于等于 20

fetchall 把满足条件的全取回来,装在列表里。

第 55 页课件

试一试同一个结果集,三种取法

execute 之后调哪一个
结果集取走了吗
返回值

重 点

fetchall 给列表,列表里每一项是一行的元组。

知道更多

上一句结果没取完就发下一句,真机报 InternalError: Unread result found。

上机做

上机四第 2 题 拼串跑一次

想一想

结果集能连着取两遍吗?

56
第 17 章 · 第六节

示例 5:只要第一条

fetchone 给一个元组,不是列表。

第 56 页课件

试一试自己拼 SQL 还是交给它拼

用户输入的名字
自己拼:sql = “SELECT * FROM s WHERE sn = '%s'” % name
交给它拼:cursor.execute(“SELECT * FROM s WHERE sn = %s”, (name,))

重 点

课件全程用 % 拼串,输入里带一个单引号就把语义拼歪了。

知道更多

正确写法是 cursor.execute(sql, (20,)),值单独送,驱动替你转义。

上机做

上机四第 5 题 换成参数化

想一想

为什么 (20) 不行,(20,) 才行?

57
第 17 章 · 第六节

第四块:commit 和 rollback

这两个方法是这一章的落点。

第 57 页课件

重 点

connector 默认不自动提交,所以每一笔都要你自己收尾。

知道更多

第 9 章在 mysql> 里默认是自动提交的,Python 这边正好反过来。

58
第 17 章 · 第六节

原子性、一致性、隔离性、持久性

第 9 章讲过的 ACID,在 Python 里靠这两个方法落地。

第 58 页课件

关键术语

原子性Atomicity
一笔事务里的几件事要么全做,要么全不做
持久性Durability
提交之后就算断电也还在

重 点

try 里全做完才 commit,出错就 rollback,这就是原子性。

上机做

上机五第 2 题 一条坏的拖垮一批

想一想

两条 INSERT 分成两个 try,还有原子性吗?

59
第 17 章 · 第六节

commit 提交,rollback 撤销

撤只撤回到上一次 commit 那儿。

第 59 页课件

记牢它记牢它

  1. 读不 commit
  2. 写必 commit
  3. 不提交白干

重 点

关闭连接时没提交的一律撤销,断电、断网也是这个下场。

知道更多

查询不改数据,所以 SELECT 之后 commit 一下什么也不会发生。

上机做

上机五第 4 题 关掉也是回滚

练一练

关于 db.rollback(),下列说法正确的是?
  1. A它用来关闭连接
  2. BSELECT 失败也要调它
  3. C它撤销还没提交的改动
  4. D调完还要再 commit 一次
答案 C

rollback 把数据退回上一次 commit 之后的样子,没提交的一律作废。

想一想

commit 之后还能 rollback 回去吗?

60
第 17 章 · 第六节

五步、两个方法、三个 fetch

这一章要带走的就这三样。

第 60 页课件

记牢它三样

  1. 五步:导连游执关
  2. 两法:commit rollback
  3. 三取:one many all

重 点

换成别的数据库,改的只有导入那一行和 connect 的参数。

上机做

上机五第 6 题 写一段完整的

想一想

整本书学完,你最想拿它做点什么?

保山学院·人工智能教研室·曹鼎鼎