前言
很多初学者在学习 Python 数据库操作时,会直接从 MySQL 或 PostgreSQL 开始。但对于个人项目、桌面工具和学习案例来说,SQLite 是一个非常合适的选择。
SQLite 不需要单独安装数据库服务,数据直接保存在一个文件中,Python 也自带sqlite3模块。通过 SQLite,我们可以快速构建一个简单的任务管理系统,掌握数据库连接、建表、增删改查等核心知识。
一、SQLite 的特点
SQLite 是一种轻量级关系型数据库,主要有以下特点:
- 不需要启动独立服务;
- 数据保存在单个文件中;
- 支持标准 SQL;
- 适合小型应用和本地工具;
- Python 内置支持。
如果项目访问量较小,或者只是需要保存少量结构化数据,SQLite 可以满足基本需求。当系统规模扩大后,再迁移到 MySQL 或 PostgreSQL 也不迟。
二、连接数据库并创建数据表
首先导入sqlite3:
import sqlite3 connection = sqlite3.connect("tasks.db") cursor = connection.cursor()然后创建任务表:
cursor.execute(""" CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, status TEXT NOT NULL DEFAULT '未完成', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """) connection.commit() connection.close()这里定义了四个字段:
id:任务编号;title:任务标题;status:任务状态;created_at:创建时间。
IF NOT EXISTS可以避免程序重复运行时再次创建同名表。
三、添加任务
将数据库操作封装成函数:
import sqlite3 def add_task(title): connection = sqlite3.connect("tasks.db") connection.execute( "INSERT INTO tasks (title) VALUES (?)", (title,) ) connection.commit() connection.close()这里的问号是参数占位符,实际数据通过元组传入。不要直接使用字符串拼接 SQL,例如:
sql = f"INSERT INTO tasks (title) VALUES ('{title}')"字符串拼接可能造成 SQL 注入问题,使用参数化查询更加安全。
四、查询任务
查询全部任务:
def get_tasks(): connection = sqlite3.connect("tasks.db") cursor = connection.execute(""" SELECT id, title, status, created_at FROM tasks ORDER BY id DESC """) tasks = cursor.fetchall() connection.close() return tasks调用函数并打印结果:
for task in get_tasks(): print(task)查询结果通常以元组形式返回,例如:
(1, '学习 Python', '未完成', '2026-09-08 10:00:00')五、修改和删除任务
将任务标记为已完成:
def finish_task(task_id): connection = sqlite3.connect("tasks.db") connection.execute( "UPDATE tasks SET status = '已完成' WHERE id = ?", (task_id,) ) connection.commit() connection.close()删除任务:
def delete_task(task_id): connection = sqlite3.connect("tasks.db") connection.execute( "DELETE FROM tasks WHERE id = ?", (task_id,) ) connection.commit() connection.close()执行更新和删除操作后,必须调用commit(),否则修改不会真正写入数据库。
六、封装数据库连接
如果每个函数都重复编写连接和关闭代码,维护起来会比较麻烦。可以定义一个上下文管理器:
from contextlib import contextmanager import sqlite3 @contextmanager def get_connection(): connection = sqlite3.connect("tasks.db") try: yield connection connection.commit() except Exception: connection.rollback() raise finally: connection.close()使用方式:
def add_task(title): with get_connection() as connection: connection.execute( "INSERT INTO tasks (title) VALUES (?)", (title,) )这样可以自动提交事务,也能在发生异常时回滚数据。
七、制作命令行任务系统
下面实现一个简单的命令行菜单:
def main(): while True: print("\n1. 添加任务") print("2. 查看任务") print("3. 完成任务") print("4. 删除任务") print("5. 退出") choice = input("请选择操作:") if choice == "1": title = input("请输入任务内容:") add_task(title) print("任务添加成功") elif choice == "2": tasks = get_tasks() if not tasks: print("暂无任务") else: for task in tasks: print( f"{task[0]}. {task[1]} " f"[{task[2]}] {task[3]}" ) elif choice == "3": task_id = int(input("请输入任务编号:")) finish_task(task_id) print("任务已完成") elif choice == "4": task_id = int(input("请输入任务编号:")) delete_task(task_id) print("任务删除成功") elif choice == "5": print("程序退出") break else: print("无效选项")实际使用时,还需要对int(input())进行异常处理,避免用户输入非数字导致程序崩溃。
八、项目优化方向
这个任务管理系统还可以继续完善:
- 增加任务优先级;
- 增加截止日期;
- 支持按状态筛选;
- 支持模糊搜索;
- 增加用户登录功能;
- 使用 Tkinter 制作图形界面;
- 使用 FastAPI 提供 Web 接口。
通过不断扩展功能,可以将它逐渐发展为一个完整的小型项目。
总结
SQLite 是学习数据库编程的理想工具。它结构简单、使用方便,特别适合个人项目和 Python 入门实践。
本文实现了一个任务管理系统,涵盖了数据库连接、数据表创建、插入、查询、修改、删除和事务处理等基本知识。掌握这些内容后,可以进一步学习 ORM 框架,例如 SQLAlchemy,将数据库操作封装得更加简洁。
学习数据库的重点不只是记住 SQL 语句,更要理解数据结构、事务和安全性。只有把数据库知识应用到实际项目中,才能真正提升开发能力。