第 17 章 · 第六节
第三块:SELECT 多一步
查询比增删改多一步 fetch,少一步 commit。

重 点
多出来的那一步是 fetch,省掉的那一步是 commit。
分清楚两类语句
| 语句 | 多什么少什么 |
|---|---|
| 增删改 | 要 commit |
| 查询 | 要 fetch |
查询比增删改多一步 fetch,少一步 commit。

多出来的那一步是 fetch,省掉的那一步是 commit。
| 语句 | 多什么少什么 |
|---|---|
| 增删改 | 要 commit |
| 查询 | 要 fetch |
fetchall 把满足条件的全取回来,装在列表里。

| 结果集 | 取走了吗 |
|---|
fetchall 给列表,列表里每一项是一行的元组。
上一句结果没取完就发下一句,真机报 InternalError: Unread result found。
结果集能连着取两遍吗?
fetchone 给一个元组,不是列表。

课件全程用 % 拼串,输入里带一个单引号就把语义拼歪了。
正确写法是 cursor.execute(sql, (20,)),值单独送,驱动替你转义。
为什么 (20) 不行,(20,) 才行?
这两个方法是这一章的落点。

connector 默认不自动提交,所以每一笔都要你自己收尾。
第 9 章在 mysql> 里默认是自动提交的,Python 这边正好反过来。
第 9 章讲过的 ACID,在 Python 里靠这两个方法落地。

try 里全做完才 commit,出错就 rollback,这就是原子性。
两条 INSERT 分成两个 try,还有原子性吗?
撤只撤回到上一次 commit 那儿。

关闭连接时没提交的一律撤销,断电、断网也是这个下场。
查询不改数据,所以 SELECT 之后 commit 一下什么也不会发生。
rollback 把数据退回上一次 commit 之后的样子,没提交的一律作废。
commit 之后还能 rollback 回去吗?
这一章要带走的就这三样。

换成别的数据库,改的只有导入那一行和 connect 的参数。
整本书学完,你最想拿它做点什么?