第 49 课 · 阶段八 · 项目实战

数据库:SQLite

数据要长期保存怎么办?SQLite 是 Python 自带的轻量数据库。这一课掌握建表、增删改查,把数据真正“存起来”。

第 49 课阶段八 · 项目实战难度:进阶建议时长:45 分钟关键词:sqlite3 · 建表 · 增删改查

🎯 学完本课你将掌握

  • 连接 SQLite 并创建表
  • 完成 INSERT/UPDATE/DELETE/SELECT
  • 理解 SQL 参数化防注入
  • 综合运用做个备忘录

一、SQLite 是什么

SQLite 是一个文件型数据库,零配置、Python 自带模块 sqlite3,无需安装服务器。适合个人项目、移动应用、学习数据库入门。

二、连接并创建表

建表.py
1import sqlite3
2
3conn = sqlite3.connect("school.db") # 连接(没有会自动创建)
4cur = conn.cursor()
5
6cur.execute("""
7 CREATE TABLE IF NOT EXISTS student (
8 id INTEGER PRIMARY KEY AUTOINCREMENT,
9 name TEXT NOT NULL,
10 score INTEGER
11 )
12""")
13conn.commit() # 提交事务
14conn.close()

三、插入数据

插入.py
1import sqlite3
2conn = sqlite3.connect("school.db")
3cur = conn.cursor()
4
5cur.execute("INSERT INTO student (name, score) VALUES (?, ?)", ("小明", 92))
6cur.execute("INSERT INTO student (name, score) VALUES (?, ?)", ("小红", 88))
7conn.commit()
8conn.close()
✅ 要点
用 ? 占位符传参是防止 SQL 注入的标准姿势,绝不能用字符串拼接 SQL。

四、查询数据

查询.py
1import sqlite3
2conn = sqlite3.connect("school.db")
3cur = conn.cursor()
4
5cur.execute("SELECT * FROM student")
6rows = cur.fetchall() # 所有行
7for r in rows:
8 print(r) # (1, '小明', 92)
9
10cur.execute("SELECT * FROM student WHERE score >= 90")
11print(cur.fetchall()) # 条件查询
12conn.close()

五、更新与删除

更新删除.py
1import sqlite3
2conn = sqlite3.connect("school.db")
3cur = conn.cursor()
4
5cur.execute("UPDATE student SET score = ? WHERE name = ?", (95, "小明"))
6cur.execute("DELETE FROM student WHERE name = ?", ("小红",))
7conn.commit()
8conn.close()

六、with 管理连接

with 写法.py
1import sqlite3
2with sqlite3.connect("school.db") as conn:
3 cur = conn.cursor()
4 cur.execute("SELECT * FROM student")
5 for r in cur.fetchall():
6 print(r)

七、实战:命令行备忘录

备忘录.py
1import sqlite3
2
3with sqlite3.connect("notes.db") as conn:
4 cur = conn.cursor()
5 cur.execute("CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, content TEXT)")
6
7while True:
8 print("1 添加 2 查看 3 删除 0 退出")
9 choice = input("请选择:")
10 if choice == "1":
11 content = input("内容:")
12 with sqlite3.connect("notes.db") as conn:
13 conn.execute("INSERT INTO notes (content) VALUES (?)", (content,))
14 elif choice == "2":
15 with sqlite3.connect("notes.db") as conn:
16 for r in conn.execute("SELECT * FROM notes"):
17 print(r)
18 elif choice == "3":
19 rid = input("要删除的ID:")
20 with sqlite3.connect("notes.db") as conn:
21 conn.execute("DELETE FROM notes WHERE id = ?", (rid,))
22 elif choice == "0":
23 break

八、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
sqlite3.OperationalError: no such table表还没创建,先执行 CREATE TABLE 语句。
忘记 commit 数据没保存INSERT/UPDATE/DELETE 后要 conn.commit();用 with 则自动提交。
SQL 注入风险永远用 ? 占位符传参,不要拼接字符串。
✍️ 小练习
做一个“图书管理”数据库:建 books 表(书名、作者、价格),实现添加、按价格排序查询、删除指定书名。
📌 本节小结
SQLite 四连:connect 连接、cursor 执行、? 占位传参、commit 提交。掌握 INSERT/SELECT/UPDATE/DELETE,你就有了让数据“永生”的能力。下一课用全部所学做一个完整项目。