零基础也能上手的Python实战项目,从「内存存储」升级为「数据库持久化存储」,新增用户注册/登录功能,完整覆盖学生信息增删改查全流程!
📖 系统核心升级亮点
相比基础版,本次升级核心变化:
- 数据存储:从字典临时存储 → SQLite数据库持久化存储(关闭程序数据不丢失)
- 用户体系:新增「注册+登录」功能,支持多用户独立使用
- 信息维度:学生信息从4项(学号/姓名/性别/班级)扩展至7项(新增身高/体重/电话)
- 功能完整性:补充「修改学生信息」功能,完善退出时的资源释放逻辑
🛠 系统环境与前置准备
运行环境
- Python 3.x(无需额外安装依赖,SQLite为Python内置库)
- 数据库文件路径:
D:\Desktop\PythonPrograms\database\mydadabase.db(可自行修改代码中路径)
数据库表结构(需提前创建)
-- 用户信息表(userInfos)CREATETABLE userInfos ( 用户名 TEXT PRIMARY KEY, 密码 TEXTNOTNULL);-- 学生信息表(stuInfos)CREATETABLE stuInfos ( 学号 TEXT PRIMARY KEY, 姓名 TEXTNOTNULL, 性别 TEXTNOTNULL, 班级 TEXTNOTNULL, 身高 TEXTNOTNULL, 体重 TEXTNOTNULL, 电话 TEXTNOTNULL);
📋 完整功能清单
| | |
|---|
| | |
| | |
| | 录入学号、姓名、性别、班级、身高、体重、电话,学号为唯一标识 |
| | |
| | |
| | |
| | |
| | |
🧪 全功能测试结果(附输入输出示例)
测试1:用户注册功能
| | |
|---|
| 功能序号:2用户名:testuser密码:123456 | |
| 功能序号:2用户名:testuser密码:654321 | |
测试2:用户登录功能
| | |
|---|
| 功能序号:1用户名:testuser密码:123456 | |
| 功能序号:1用户名:wronguser密码:123456 | |
| 功能序号:1用户名:testuser密码:111111 | |
测试3:新增学生信息功能
| | |
|---|
| 功能序号:1学号:001姓名:张三性别:男班级:七年级1班身高:175cm体重:60kg电话:13800138000 | |
| | 程序抛出主键重复异常(注:可优化代码增加重复学号提示) |
测试4:修改学生信息功能
| | |
|---|
| 功能序号:2要修改的学号:001新姓名:张小三新性别:男新班级:七年级2班新身高:176cm新体重:61kg新电话:13900139000 | |
| | |
测试5:删除学生信息功能
测试6:查询单个学生信息功能
| | |
|---|
| | 查询信息如下:学号:001 姓名:张三 性别:男 班级:七年级1班 身高:175cm 体重:60kg 电话:13800138000 |
| | |
测试7:查询所有学生信息功能
| | | |
|---|
| | | 查询信息如下:学号:001 姓名:张三 性别:男 班级:七年级1班 身高:175cm 体重:60kg 电话:13800138000学号:002 姓名:李四 性别:女 班级:七年级2班 身高:165cm 体重:48kg 电话:13700137000 |
| | | |
测试8:退出系统功能
| | |
|---|
| | 欢迎下次使用!再见!游标、数据库连接关闭,程序终止 |
📝 完整源码(可直接复制运行)
import sqlite3# 连接SQLite数据库(不存在则自动创建)con = sqlite3.connect(r"D:\Desktop\PythonPrograms\database\mydadabase.db")cursor = con.cursor() # 创建游标对象,用于执行SQL语句# -------------------------- 第一步:用户注册/登录模块 --------------------------whileTrue: print() print("--------------欢迎来到学生信息管理系统------------") print("1.登录系统\n2.注册账号") number = input("请输入功能序号:")# 注册账号逻辑if number == "2": user = input("请输入用户名:")# 查询用户名是否已存在 selectSql = f"""select * from userInfos where 用户名='{user}';""" cursor.execute(selectSql) result = cursor.fetchone()if result: print("用户名已存在,请重新注册!")continue# 重新进入注册/登录选择# 用户名不存在,执行注册 password = input("请输入密码:") insertSql = f"""insert into userInfos(用户名,密码) values ('{user}','{password}');""" con.execute(insertSql) con.commit() # 提交事务 print("注册成功!请登录!")# 登录系统逻辑elif number == "1": user = input("请输入用户名:") password = input("请输入密码:")# 查询用户信息 selectSql = f"""select * from userInfos where 用户名='{user}';""" cursor.execute(selectSql) result = cursor.fetchone() # 返回格式:("用户名","密码")if result:# 验证密码if password == result[1]: print("登录成功!")break# 登录成功,退出登录循环,进入功能菜单else: print("密码错误!请重新登录!")else: print("用户名不存在!请先注册用户!")# 输入错误序号else: print("请输入正确的功能序号!!!")# -------------------------- 第二步:学生信息管理模块 --------------------------whileTrue: print() print("--------------欢迎来到学生信息管理系统------------") print("1.新增学生信息\t2.修改学生信息\t3.删除学生信息") print("4.查询学生信息\t5.查询所有信息\t6.退出管理系统") number = input("请输入功能序号:")# 4. 查询单个学生信息if number == "4": stuId = input("请输入要查询的学号:") selectSql = f"""select * from stuInfos where 学号='{stuId}';""" cursor.execute(selectSql) result = cursor.fetchone() # 返回元组:(学号,姓名,性别,班级,身高,体重,电话)if result: print("查询信息如下:") print(f"学号:{result[0]} 姓名:{result[1]} 性别:{result[2]} 班级:{result[3]} 身高:{result[4]} 体重:{result[5]} 电话:{result[6]}")else: print("该学生信息不存在!请先录入系统!")# 5. 查询所有学生信息elif number == "5": selectSql = f"""select * from stuInfos;""" cursor.execute(selectSql) resultList = cursor.fetchall() # 返回二维列表:[(学号1,...),(学号2,...)]if resultList: print("查询信息如下:")for result in resultList: print(f"学号:{result[0]} 姓名:{result[1]} 性别:{result[2]} 班级:{result[3]} 身高:{result[4]} 体重:{result[5]} 电话:{result[6]}")else: print("不存在学生信息,请先录入!")# 1. 新增学生信息elif number == "1": stuId = input("请输入学号:") stuName = input("请输入姓名:") stuGender = input("请输入性别:") stuClass = input("请输入班级:") stuHeight = input("请输入身高:") stuWeight = input("请输入体重:") stuTel = input("请输入电话:") insertSql = f"""insert into stuInfos(学号,姓名,性别,班级,身高,体重,电话) values ('{stuId}','{stuName}','{stuGender}','{stuClass}','{stuHeight}','{stuWeight}','{stuTel}'); """ con.execute(insertSql) con.commit() print("该学生信息新增成功!!!")# 2. 修改学生信息elif number == "2": stuId = input("请输入要修改的学号:") selectSql = f"""select * from stuInfos where 学号='{stuId}';""" cursor.execute(selectSql) result = cursor.fetchone()if result: stuName = input("请输入要修改的姓名:") stuGender = input("请输入要修改的性别:") stuClass = input("请输入要修改的班级:") stuHeight = input("请输入要修改的身高:") stuWeight = input("请输入要修改的体重:") stuTel = input("请输入要修改的电话:") updateSql = f"""update stuInfos set 姓名='{stuName}',性别='{stuGender}',班级='{stuClass}',身高='{stuHeight}',体重='{stuWeight}',电话='{stuTel}' where 学号='{stuId}';""" con.execute(updateSql) con.commit() print("学生信息修改成功!")else: print("该学生信息不存在!请先录入系统!")# 3. 删除学生信息elif number == "3": stuId = input("请输入要删除的学号:") selectSql = f"""select * from stuInfos where 学号='{stuId}';""" cursor.execute(selectSql) result = cursor.fetchone()if result: deleteSql = f"""delete from stuInfos where 学号='{stuId}';""" con.execute(deleteSql) con.commit() print("学生信息删除成功!")else: print("该学生信息不存在!请先录入系统!")# 6. 退出系统elif number == "6": print("欢迎下次使用!再见!") cursor.close() # 关闭游标 con.close() # 关闭数据库连接break# 输入错误序号else: print("请输入正确的功能序号!")
🎯 优化建议(拓展学习)
- 安全性优化:当前SQL语句使用字符串拼接,存在SQL注入风险,可改用参数化查询(
cursor.execute(sql, (参数1, 参数2))) - 用户体验优化:新增学号重复提示、修改时保留原信息(无需全量输入)、输入格式校验(如电话、身高)
- 功能拓展:增加密码加密存储、学生信息导出Excel、分页查询大量数据等功能
### 总结
- 该系统基于SQLite实现了用户注册/登录+学生信息增删改查的完整业务流程,数据持久化存储更贴近实际开发场景;
- 全功能测试覆盖了正常/异常场景,可直接验证代码的完整性和健壮性;
- 源码可直接复制运行,仅需调整数据库路径并提前创建数据表,适合Python初学者学习数据库操作。