第 49 课 · 阶段八 · 项目实战
数据库:SQLite
数据要长期保存怎么办?SQLite 是 Python 自带的轻量数据库。这一课掌握建表、增删改查,把数据真正“存起来”。
🎯 学完本课你将掌握
- 连接 SQLite 并创建表
- 完成 INSERT/UPDATE/DELETE/SELECT
- 理解 SQL 参数化防注入
- 综合运用做个备忘录
一、SQLite 是什么
SQLite 是一个文件型数据库,零配置、Python 自带模块 sqlite3,无需安装服务器。适合个人项目、移动应用、学习数据库入门。
二、连接并创建表
建表.py
1import sqlite323conn = sqlite3.connect("school.db") # 连接(没有会自动创建)4cur = conn.cursor()56cur.execute("""7 CREATE TABLE IF NOT EXISTS student (8 id INTEGER PRIMARY KEY AUTOINCREMENT,9 name TEXT NOT NULL,10 score INTEGER11 )12""")13conn.commit() # 提交事务14conn.close()三、插入数据
插入.py
1import sqlite32conn = sqlite3.connect("school.db")3cur = conn.cursor()45cur.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 sqlite32conn = sqlite3.connect("school.db")3cur = conn.cursor()45cur.execute("SELECT * FROM student")6rows = cur.fetchall() # 所有行7for r in rows:8 print(r) # (1, '小明', 92)910cur.execute("SELECT * FROM student WHERE score >= 90")11print(cur.fetchall()) # 条件查询12conn.close()五、更新与删除
更新删除.py
1import sqlite32conn = sqlite3.connect("school.db")3cur = conn.cursor()45cur.execute("UPDATE student SET score = ? WHERE name = ?", (95, "小明"))6cur.execute("DELETE FROM student WHERE name = ?", ("小红",))7conn.commit()8conn.close()六、with 管理连接
with 写法.py
1import sqlite32with 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 sqlite323with 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)")67while 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,你就有了让数据“永生”的能力。下一课用全部所学做一个完整项目。