数据库原理与应用 第 17 章 · 上机二
课程第 17 章上机二 起手式查一次全表三件套堵住了再取一次逐行打印连续练习 版式
第 17 章 使用 Python 连接 MySQL 数据库 · 上机二

五步流程与 fetch 三件套

课件第 19、55、56 页那三件事:游标是有位置的,取一次少一次,取空了不报错。
已完成 0 / 6
本 次 上 机 题 目
  1. 01装驱动、进解释器、连上库
  2. 02fetchall 把结果全取回来
  3. 03fetchone、fetchmany、fetchall
  4. 04InternalError: Unread result found
  5. 05第二次 fetchall 是空列表
  6. 06for 循环 + 下标 + 解包
  7. 自己写一个:信息学院有几个人
01
第 17 章 · 上机二

装驱动、进解释器、连上库

这一页的终端是新的,五步要重新走一遍。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

每一份上机页各有一台机器,上一页装的驱动这里不算数。

知道更多

connect 的括号跨了好几行,Python 认括号不认换行。

02
第 17 章 · 上机二

fetchall 把结果全取回来

取回来的是列表,列表里每一个是元组。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

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

分清楚两种类型

拿到手的是什么
rowslist
rows[0]tuple
rows[0][1]str

想一想

len(rows) 数的是行数还是列数?

03
第 17 章 · 上机二

fetchone、fetchmany、fetchall

同一句查询跑三遍,每遍换一种取法。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

fetchone 给一个元组,另外两个给列表,哪怕只有一行。

知道更多

三个都是从当前位置往后取,取过的不会再来一遍。

04
第 17 章 · 上机二

InternalError: Unread result found

上一次的结果还堵在管子里,新的发不出去。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

一句 SELECT 的结果要么取完,要么别急着发下一句。

打个比方

像水管里还剩半管水,不放干净下一股就进不来。

知道更多

只想要一行时,fetchone 之后补一句 fetchall 把剩下的倒掉。

想一想

为什么第四行 fetchall 反而不报错?

05
第 17 章 · 上机二

第二次 fetchall 是空列表

游标已经走到底,再取只有空,还不报错。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

取空了给的是空列表和 None,都不是报错,最容易看漏。

知道更多

要用两遍就先存进变量:rows = cursor.fetchall(),再拿 rows 用。

想一想

取完之后 fetchone 给的是什么?

06
第 17 章 · 上机二

for 循环 + 下标 + 解包

课件那种一行行输出,其实就是一个 for。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

元组能按下标取,也能一次拆成几个变量,后一种更好读。

知道更多

在 >>> 里写 for,缩进那几行前面会变成三个点,空一行才算写完。

想一想

row[0] 和 sno 取到的是同一个东西吗?

第 17 章 · 上机二

自己写一个:信息学院有几个人

先数出来,再把名字一行一行打出来。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

这一题只查不改,从头到尾用不着 commit,能反复跑。

知道更多

两句查询之间没有报 Unread result,因为第一句已经 fetch 干净了。

想一想

把第二句的 fetchall 换成 fetchone 会打出几行?

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