用Python构建学生成绩管理系统的基本方案

用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.

bash 复制代码
$ python -m venv project-env
4) 激活虚拟环境

创建虚拟环境后,执行命令以激活该虚拟环境。

bash 复制代码
$ source /project-env/bin/activate
4) 安装第三方库

为了连接MySQL数据库,需要安装第三方库pymysql。于是,在虚拟环境中执行以下安装命令:

bash 复制代码
(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模块,命令如下:

python 复制代码
import pymysql
from pymysql.cursors import DictCursor

接下来,要编写学生成绩管理的类,可命名为:StudentManager;

该类中包含初始化函数,以及创建表的函数(用来以SQL语句CREATE TABLE创建表),代码如下:

python 复制代码
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()。

以下是示例代码:

python 复制代码
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(),代码如下:

python 复制代码
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()方法。代码如下:

python 复制代码
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条件句执行后,运行该应用程序。代码如下:

python 复制代码
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项目案例,还有很多很多。

技术好文陆续推出,敬请关注、收藏和点赞👍。

您的认可,我的动力! 😃

相关阅读:

  1. 2025最新版Python 3.13.3安装使用指南
  2. 【AWS入门】Amazon Bedrock简介
  3. 【AWS入门】Amazon SageMaker简介
  4. 【AWS入门】AWS身份验证和访问管理(IAM)
  5. 一分钟了解机器学习
  6. 一分钟了解深度学习
  7. 一分钟了解大语言模型(LLMs)
相关推荐
花酒锄作田11 小时前
使用 pkgutil 实现动态插件系统
python
前端付豪15 小时前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽15 小时前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战15 小时前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋21 小时前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
AI探索者2 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者2 天前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
FishCoderh2 天前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅2 天前
Python函数入门详解(定义+调用+参数)
python
曲幽2 天前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama