作者:许灼灼
Python连SQLite——派办事员去档案室(sqlite3)
一、课堂故事
上节课,小婉在 Python 里用 SELECT 把王芳的成绩查出来了,开心得不行。可她回头一看代码:
「老师,我每查一次,都得先把 connect、cursor、execute 这一大串写一遍……这也太啰嗦了吧?而且我刚才插了条数据,一关程序再看,咋没了?」
老师笑了:「啰嗦是因为你还没把『连接数据库』这回事弄明白。至于数据没了——八成是你忘了『提交』。今天咱就把 Python 怎么连数据库,从头到尾捋一遍。」
小婉:「那 sqlite3 又是个啥?上节课代码第一行就 import 它了。」
老师:「问得好。sqlite3 就是派去档案室的『办事员』——Python 自带,不用装,专门负责帮你跑腿传话。」
二、概念解释
sqlite3 是 Python 内置的一个模块(标准库),专门用来操作 SQLite 数据库。它像个「档案室办事员」:
- 你(Python 程序)是老板,坐在办公室里不下楼。
- sqlite3 就是那个跑腿的办事员,你给它一句话(SQL 命令),它下楼帮你办。
用它的标准四步:
connect():建立连接。「喂,办事员,去『成绩.db』那个档案室报到。」cursor()execute()close()
记住一句话:connect 是连上,cursor 是干活,close 是收工。
三、拆开看
3.1 第一步:connect 建立连接
import sqlite3 conn = sqlite3.connect("成绩.db") import sqlite3:引入模块。注意它不用 pip 安装,Python 自带。sqlite3.connect("成绩.db"):连上这个数据库文件。如果文件不存在,SQLite 会自动新建一个空的。- 返回的
conn 是个「连接对象」,代表你和数据库之间的这条线。
小婉问:「那如果我不小心写错文件名,连了个不存在的,会不会报错?」
老师:「不会报错,它会直接给你建一个新的空库——所以有时候你以为连上了老库,其实是新建了个空的,查出来啥也没有。文件名要写对。」
3.2 第二步:cursor 游标,真正干活的家伙
cur = conn.cursor()
conn.cursor():从连接里拿一个「游标」(cursor)。你可以理解成办事员手里那个记事本——你要它记着待会儿要办的事。- 后面所有的
execute() 都通过 cur 来发,不是 conn。
3.3 第三步:execute 发命令
查询(取数据):
cur.execute("SELECT 姓名, 语文 FROM 学生成绩表 WHERE 语文 > 80") rows = cur.fetchall() # 把结果全部领回来 for row in rows: print(row) # 每行是一个元组 写入(插数据):
cur.execute("INSERT INTO 学生成绩表 (姓名, 语文, 数学) VALUES ('赵敏', 88, 91)") conn.commit() # ⚠️ 写入后必须提交! 注意看两段的区别:查询完直接 fetchall() 拿结果;写入完多了一句 conn.commit()。
3.4 关键区分:什么时候要 commit?
这是今天最容易踩的坑:
- 查询(SELECT)、建表(CREATE)
- 写入(INSERT、UPDATE、DELETE):改了库里的「内容」,必须
conn.commit() 才算真正存进去。不提交 = 白干,关程序数据就没了(正是小婉刚才遇到的怪事)。
为什么?因为 SQLite 把「改动」先放在一边,等你喊「提交」才正式落盘。commit 就是那句「确认保存」。
3.5 第四步:close 收工
conn.close()
用完数据库,记得 close() 关门。不关通常不会出大事,但好习惯要从小养成——尤其程序跑很久、开很多连接时,不关会占资源。
四、常见坑
坑 1:写入后忘了 commit,数据「消失」
最常见!INSERT 跑完不报错,但一关程序数据没了。记住:凡是改内容的操作,末尾都加 conn.commit()。
坑 2:在 conn 上直接 execute
conn.execute(...) 其实也能跑,但我们统一用 cur = conn.cursor() 然后 cur.execute(...)。新手混着写容易乱,建议固定用 cursor。
坑 3:fetchall 拿到的是「元组列表」
rows 长这样:[('王芳', 92), ('张三', 85)]。取第一列用 row[0],第二列 row[1]。别以为 row['姓名'] 能直接用(默认不行)。
坑 4:连接没关就又 connect 同个文件
虽然 SQLite 允许,但频繁开关、不关连接,容易出「数据库被锁定」的提示。用完就 close(),最稳妥。
坑 5:把 .db 文件路径写错,连成空库
connect("成绩.db") 路径不对时,它会默默新建空文件。你查出来啥也没有,还以为代码错了。确认文件名和位置对得上。
五、生活类比
把 Python 连数据库想象成老板派办事员去档案室:
import sqlite3 = 公司招了个专门跑档案室的办事员(还不用付工资,Python 自带)。connect("成绩.db") = 老板说:「去『成绩.db』那间档案室,报到!」办事员连上了门。cursor()execute("SELECT ...")fetchall()commit() = 如果老板让他「改了档案内容」,得补一句「确认存档」,改的才真生效。close()
一句话记忆:connect 连门,cursor 记事本,execute 发话,commit 存档,close 关门。
六、练一练
1. 填空
Python 连 SQLite 要先 ______(建立连接),再 ______(拿游标),发命令用 ______,写完数据必须 ______,最后 ______。
2. 找错
下面这段代码哪里会出问题?改一改。
import sqlite3 conn = sqlite3.connect("成绩.db") cur = conn.cursor() cur.execute("INSERT INTO 学生成绩表 (姓名, 数学) VALUES ('李雷', 77)") print("插入成功") 3. 想一想
为什么 SELECT 查询不需要 commit,而 INSERT 需要?用「档案室办事员」的类比解释一下。
下节课预告:连接、游标、commit 都搞定了,咱就能把前面学的 GradeManager(学生管理)真正接上数据库,做永久花名册了。综合实战,敬请期待!