用Python构建学生成绩管理系统的基本方案
A Basic Solution to Build A Student Score Management System with Python
By Jackson@ML
如果有想法,要构建一个基于Python的学生成绩管理系统,那么,首先要规划出该项目的方案,或者框架。
可以逐步把结构清晰的方案勾勒出来,然后,使用代码逐步实现,完成这项任务。本文以macOS系统为例,对简易方案进行规划,希望对读者有所帮助。
1. 搭建环境
1) 安装Python最新版
基于Python的应用程序,离不开Python软件包;其标准库可以支持多数代码开发,扩展功能可安装第三方库支持。
安装使用过程可参照:2025最新版Python 3.13.3安装使用指南
本文不再赘述安装过程。
2) 安装Visual Studio Code最新版
如要安装VS Code最新版,请参照文章:2024最新版Visual Studio Code安装使用指南, 本文不再赘述。
3) 搭建虚拟环境
在VS Code终端执行命令,搭建符合项目要求的虚拟环境,例如,项目虚拟环境名为:project-env.
$ python -m venv project-env
4) 激活虚拟环境
创建虚拟环境后,执行命令以激活该虚拟环境。
$ source /project-env/bin/activate
4) 安装第三方库
为了连接MySQL数据库,需要安装第三方库pymysql。于是,在虚拟环境中执行以下安装命令:
(project-env) $ pip install pymysql
2. 数据库设计
由于是学生成绩管理系统,因此,假设要规划学生表students,和成绩表scores。大致架构如下:
1) 学生表 students
- student_id 学号(主键)
- name 姓名
- gender 性别
- age 年龄
- class 班级
2) 成绩表 scores
- score_id 成绩ID(主键)
- student_id 学号(外键)
- subject 科目
- score 分数
- exam_date 考试日期
3. 数据库连接
如需连接数据库,则需编写代码。首先,需要导入pymysql库,以及pymysql.cursors中的DictCursor模块,命令如下:
import pymysql
from pymysql.cursors import DictCursor
接下来,要编写学生成绩管理的类,可命名为:StudentManager;
该类中包含初始化函数,以及创建表的函数(用来以SQL语句CREATE TABLE创建表),代码如下:
class StudentManager:
def __init__(self):
"""初始化数据库连接"""
self.connection = pymysql.connect(
host='localhost',
user='your_username',
password='your_password',
database='student_db',
charset='utf8mb4',
cursorclass=DictCursor
)
self.create_tables()
def create_tables(self):
"""创建数据表"""
with self.connection.cursor() as cursor:
# 创建学生表
cursor.execute("""
CREATE TABLE IF NOT EXISTS students (
student_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender ENUM('男', '女') NOT NULL,
age TINYINT UNSIGNED,
class VARCHAR(20)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
""")
# 创建成绩表
cursor.execute("""
CREATE TABLE IF NOT EXISTS scores (
score_id INT AUTO_INCREMENT PRIMARY KEY,
student_id VARCHAR(20) NOT NULL,
subject VARCHAR(50) NOT NULL,
score DECIMAL(5,2),
exam_date DATE,
FOREIGN KEY (student_id)
REFERENCES students(student_id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
""")
self.connection.commit()
4. 主要功能实现
1) 模块一:学生管理
实现该模块,需要创建添加学生函数add_student(),查询学生信息函数get_student(),以及更新学生信息函数update_student()。
以下是示例代码:
def add_student(self, student_id, name, gender, age=None, class_=None):
"""添加学生记录"""
try:
with self.connection.cursor() as cursor:
sql = """
INSERT INTO students
(student_id, name, gender, age, class)
VALUES (%s, %s, %s, %s, %s)
"""
cursor.execute(sql, (student_id, name, gender, age, class_))
self.connection.commit()
print("学生添加成功")
except pymysql.IntegrityError:
print("错误:学号已存在")
def get_student(self, student_id):
"""查询学生信息"""
with self.connection.cursor() as cursor:
sql = "SELECT * FROM students WHERE student_id = %s"
cursor.execute(sql, (student_id,))
return cursor.fetchone()
def update_student(self, student_id, **kwargs):
"""更新学生信息"""
valid_fields = ['name', 'gender', 'age', 'class']
updates = []
params = []
for field, value in kwargs.items():
if field in valid_fields:
updates.append(f"{field} = %s")
params.append(value)
if updates:
sql = f"UPDATE students SET {', '.join(updates)} WHERE student_id = %s"
params.append(student_id)
with self.connection.cursor() as cursor:
cursor.execute(sql, params)
self.connection.commit()
print(f"成功更新{cursor.rowcount}条记录")
2) 模块二:成绩管理
成绩管理模块代码包含添加分数函数add_score(),以及查询成绩函数get_scores(),代码如下:
def add_score(self, student_id, subject, score, exam_date):
"""添加成绩记录"""
try:
with self.connection.cursor() as cursor:
sql = """
INSERT INTO scores
(student_id, subject, score, exam_date)
VALUES (%s, %s, %s, %s)
"""
cursor.execute(sql, (student_id, subject, score, exam_date))
self.connection.commit()
print("成绩添加成功")
except pymysql.IntegrityError:
print("错误:学生不存在")
def get_scores(self, student_id):
"""查询学生所有成绩"""
with self.connection.cursor() as cursor:
sql = """
SELECT s.name, sc.subject, sc.score, sc.exam_date
FROM scores sc
JOIN students s ON sc.student_id = s.student_id
WHERE sc.student_id = %s
"""
cursor.execute(sql, (student_id,))
return cursor.fetchall()
3) 模块三:统计查询
统计查询模块,包含班级成绩汇总函数get_class_summary(),返回值为游标cursor的fetchall()方法。代码如下:
def get_class_summary(self, class_name):
"""班级成绩汇总"""
with self.connection.cursor() as cursor:
sql = """
SELECT s.class, sc.subject,
AVG(sc.score) as avg_score,
MAX(sc.score) as max_score,
MIN(sc.score) as min_score
FROM scores sc
JOIN students s ON sc.student_id = s.student_id
WHERE s.class = %s
GROUP BY sc.subject
"""
cursor.execute(sql, (class_name,))
return cursor.fetchall()
4) 执行查询和统计结果
完成了上述模块规划,将逐步把方法联系到一起,在if条件句执行后,运行该应用程序。代码如下:
if __name__ == "__main__":
manager = StudentManager()
# 添加测试数据
manager.add_student('2023001', '张三', '男', 18, '高三(1)班')
manager.add_score('2023001', '数学', 95.5, '2023-06-15')
# 查询学生信息
student = manager.get_student('2023001')
print("学生信息:", student)
# 查询成绩
scores = manager.get_scores('2023001')
print("考试成绩:", scores)
# 班级统计
summary = manager.get_class_summary('高三(1)班')
print("班级汇总:", summary)
# 关闭连接
manager.connection.close()
5. 注意事项:
1) 数据完整性
为确保数据完整使用外键约束确保成绩必须对应有效学生;严格校验字段类型。确保MySQL服务已启动且用户有权限。
2) 安全措施
生产环境需要添加异常处理机制;上下文管理自动管理游标;用参数化查询防止SQL注入;提交事务确保数据一致性。
3) 扩展性
DictCursor返回字典格式结果;具备动态字段更新机制;具有灵活的统计查询接口。
本方案包含了环境搭建、数据库设计、核心功能实现及较完整的代码示例。
采用面向对象程序设计,具有良好的扩展性,以及可维护性。实现复杂项目方案时,可以参考本方案,并根据具体需求适当扩展和优化。
关于Python项目案例,还有很多很多。
技术好文陆续推出,敬请关注、收藏和点赞👍。
您的认可,我的动力! 😃