python基于sqlite3的学生管理系统

import re
import sqlite3
import time
import os


# 数据库类
class StuDB:

    # 初始化方法
    def __init__(self):
        self.con = sqlite3.connect("pythonTest.db")
        self.cur = self.con.cursor()

    # 初始化存储学生信息的表
    def initStudentTable(self):
        try:
            self.cur.execute("""
    CREATE TABLE student (
    id INTEGER auto_increment PRIMARY KEY ,
    name CHAR(10) NOT NULL,
    chinese int NOT NULL,
    math int NOT NULL,
    english int NOT NULL
    );
    """)
        except Exception as e:
            print(e)
        finally:
            StuDB.close(self)

            # self.con.commit()
            # if self.cur is not None:
            #     self.cur.close()
            # if self.con is not None:
            #     self.con.close()

    # 关闭资源
    def close(self):
        self.con.commit()
        if self.cur is not None:
            self.cur.close()
        if self.con is not None:
            self.con.close()

    #     业务区
    # 成绩限制值方法
    @staticmethod
    def __enterScore(message):
        while True:
            try:
                score = int(input(message))
                if 0 <= score <= 100:
                    break
                else:
                    print("输入错误,成绩应该在0-100之间")
            except Exception as e:
                print(e)
                print("输入错误,成绩应该在0-100之间")
        return score

    # 是否继续方法
    @staticmethod
    def __whetherContinue(cls, str):
        # 判断是否继续
        while True:
            sr = input("请输入y/n继续" + str + ":").lower()
            if sr == 'y':
                if str == '添加':
                    cls.insertStudent()
                elif str == '删除':
                    cls.deleteStudentById()
                elif str == '修改':
                    cls.updateStudentById()
                elif str == '查找':
                    cls.selectStudentById()
                elif str == '导出':
                    cls.save()
                break
            elif sr == 'n':
                print("退出")
                break

    # 判断学号是否存在
    @staticmethod
    def __exists(cls, id):
        # sql
        sql = 'select * from student where id = ?'
        result = cls.cur.execute(sql, (id,))
        # print(result.fetchone()[0])
        # print(int(result.fetchone()))
        if len(result.fetchall()) > 0:
            return True
        else:
            return False

    # 验证增删改查数据是否成功
    @staticmethod
    def __verify(result, str1):
        # 判断表中改动的行数
        if result > 0:
            # 打印提示信息
            print(str1 + "成功!!")
        else:
            print(str1 + "失败!!!")

    # 基元方法
    # 添加学生信息
    @staticmethod
    def __insert(cls, id, name, chinese, math, english):
        # 获取光标对象
        cls.__init__()
        # 编写sql语句
        sql = "INSERT INTO student(id,name, chinese,math,english) VALUES (?,?,?,?,?);"
        try:
            # 执行sql语句
            cls.cur.execute(sql, (id, name, chinese, math, english))
        except Exception as e:
            print(e)
            print("插入数据出现错误,请检查学生学号是否重复")
            # 回滚
            cls.con.rollback()
        finally:
            cls.close()

    # 课程平均分
    def scoreAvg(self):
        # 获取光标对象
        self.__init__()
        # sql
        sql = "select  avg(chinese),avg(math),avg(english) from student"
        self.cur.execute(sql)
        result = self.cur.fetchone()
        print("语文成绩平均是:%.2f" % result[0])
        print("数学成绩平均是:%.2f" % result[1])
        print("英语成绩平均是:%.2f" % result[2])

    # 课程最高分
    def scoreMax(self):
        # 获取光标对象
        self.__init__()
        # sql
        sql = "select  max(chinese),max(math),max(english) from student"
        self.cur.execute(sql)
        result = self.cur.fetchone()
        print("语文成绩最高是:%.2f" % result[0])
        print("数学成绩最高是:%.2f" % result[1])
        print("英语成绩最高是:%.2f" % result[2])

    # 课程最低分
    def scoreMin(self):
        # 获取光标对象
        self.__init__()
        # sql
        sql = "select  min(chinese),min(math),min(english) from student"
        self.cur.execute(sql)
        result = self.cur.fetchone()
        print("语文成绩最低是:%.2f" % result[0])
        print("数学成绩最低是:%.2f" % result[1])
        print("英语成绩最低是:%.2f" % result[2])

    # 数据导入
    def load(self):
        # 获取光标对象
        self.__init__()
        # 获取文件名
        fn = input("请输入导入的文件名:")
        # 判断文件是否存在
        if os.path.exists(fn + ".txt"):
            with open(fn + ".txt", 'r', encoding='utf-8') as fp:
                while True:

                    s = fp.readline().strip("\n")
                    # 如果读取不到数据则退出循环
                    if s == '':
                        break
                    #     以 ,分隔
                    stu = s.split(',')
                    id = int(stu[0])
                    name = stu[1]
                    chinese = int(stu[2])
                    math = int(stu[3])
                    english = int(stu[4])

                    if self.__exists(self, id):
                        print("学号为:" + str(id) + "    的学生以存在。")
                    else:
                        self.__insert(self, id, name, chinese, math, english)
                print("导入完毕")
        else:
            print("导入的文件不存在")

    # 数据导出
    def save(self):
        # 获取光标对象
        self.__init__()
        try:
            fn = input("请输入要导出的文件名:")
            with  open(fn + ".txt", 'w', encoding='utf-8') as fp:
                self.cur.execute('select * from  student')
                rows = self.cur.fetchall()
                for row in rows:
                    fp.write(str(row[0]) + ',')
                    fp.write(row[1] + ',')
                    fp.write(str(row[2]) + ',')
                    fp.write(str(row[3]) + ',')
                    fp.write(str(row[4]) + '\n')
                # 判断是否导出成功
                print("导出成功")
        # 错误处理
        except Exception as e:
            print(e)
            print("导出失败")
        finally:
            # 关闭资源
            self.close()
            # 是否继续
            self.__whetherContinue(self, "导出")

    # 所有学生信息显示
    def selectStudentAll(self):
        # 获取连接
        # 获取光标对象
        StuDB.__init__(self)
        # 字符串格式化输出
        format_head = '{:8}\t{:8}\t{:8}\t{:8}\t{:8}'
        print(format_head.format('学号', '姓名', '语文', '数学', '英语'))

        # 查询数据的sql语句
        sql = "SELECT * FROM student;"
        # 执行sql语句
        self.cur.execute(sql)
        # 获取多条查询数据
        ret = self.cur.fetchall()
        # 关闭资源
        self.close()
        format_con = '{:^8}\t{:8}\t{:^8}\t{:^8}\t{:^8}'
        for stu in ret:
            print(format_con.format(stu[0], stu[1], stu[2], stu[3], stu[4]))

    # 根据学生
    def selectStudentById(self):
        # 获取连接
        # 获取光标对象
        StuDB.__init__(self)

        while True:
            # 收集学生学号
            stuNum = int(''.join([x for x in input("请输入要添加的学生学号:") if x.isdigit()]))
            # 判断学号是否存在
            result = self.__exists(self, stuNum)
            if result:
                # 学号已经存在
                break
            else:
                # 学号不存在
                print("学号不存在,请重新输入学号")

        # 字符串格式化输出
        format_head = '{:8}\t{:8}\t{:8}\t{:8}\t{:8}'
        print(format_head.format('学号', '姓名', '语文', '数学', '英语'))
        # 查询数据的sql语句
        sql = "SELECT * FROM student where id  = ?;"
        try:

            # 执行sql语句
            self.cur.execute(sql, (stuNum,))
            # 获取多条查询数据
            ret = self.cur.fetchone()
            format_con = '{:^8}\t{:8}\t{:^8}\t{:^8}\t{:^8}'
            print(format_con.format(ret[0], ret[1], ret[2], ret[3], ret[4]))
        except  Exception as e:
            print(e)
        finally:
            # 关闭资源
            self.close()
            # 是否继续添加
            StuDB.__whetherContinue(self, '查找')

    # 插入单条学生信息
    def insertStudent(self):
        # print("进入函数")
        # 得到一个可以执行SQL语句的光标对象
        # 连接database
        StuDB.__init__(self)
        # 收集用户信息
        # 学号收集
        while True:
            stuNum = int(''.join([x for x in input("请输入要添加的学生学号:") if x.isdigit()]))
            # 判断学号是否存在
            result = self.__exists(self, stuNum)
            # print(result)
            if result:
                # 学号已经存在
                print("学号已经存在,请修改学号后,重新输入学号")
            else:
                # 学号不存在
                break
        name = input("请输入要添加的学生姓名:")
        chinese = self.__enterScore("请输入改学生的语文成绩")
        math = self.__enterScore("请输入改学生的数学成绩")
        english = self.__enterScore("请输入改学生的英语成绩")
        try:
            # 执行SQL语句
            self.__insert(self, stuNum, name, chinese, math, english)
            # 打印信息
            self.__verify(self.cur.rowcount, "添加")
        except Exception as e:
            print(e)
        #     关闭资源
        finally:
            # 是否继续添加
            StuDB.__whetherContinue(self, '添加')

    # 学生信息删除
    def deleteStudentById(self):
        # 获取连接
        # 获取光标对象
        StuDB.__init__(self)
        # 学号收集
        id = int(''.join([x for x in input("请输入要删除的学生学号:") if x.isdigit()]))
        # 判断学号是否存在
        try:
            if self.__exists(self, id):
                # 学号已经存在,执行删除逻辑
                print("正在删除。。。")
                # sql语句
                sql = "DELETE FROM student where id = ?"

                # 执行sql
                self.cur.execute(sql, (id,))

                # 判断表中改动的行数
                # 判断表中改动的行数
                self.__verify(self.cur.rowcount, "删除")

            else:
                print("对不起,您输入的学号不存在")

        except Exception as e:
            # 打印错误
            print(e)
            # 回滚
            self.con.rollback()
        finally:
            # 释放资源
            self.close()
            # 是否继续删除
            StuDB.__whetherContinue(self, '删除')

    # 修改学生信息
    def updateStudentById(self):
        # 获取连接
        # 获取光标对象
        self.__init__()
        # 获取要修改的学生id
        id = int(''.join([x for x in input("请输入要删除的学生学号:") if x.isdigit()]))
        # 判断学生id是否存在
        # 判断学号是否存在
        try:
            if self.__exists(self, id):
                # 获取要修改的数据
                name = input("请输入要添加的学生姓名:")
                chinese = self.__enterScore("请输入改学生的语文成绩")
                math = self.__enterScore("请输入改学生的数学成绩")
                english = self.__enterScore("请输入改学生的英语成绩")
                # sql语句
                sql = "UPDATE student set name=?,chinese=?,math=?,english=? WHERE id = ?"

                # 执行修改sql语句
                self.cur.execute(sql, (name, chinese, math, english, id))

                # 判断表中改动的行数
                self.__verify(self.cur.rowcount, "修改")

            else:
                print("对不起,您输入的学号不存在")
        except Exception as e:
            # 打印错误
            print(e)
            # 回滚
            self.con.rollback()
        finally:
            # 释放资源
            self.close()
            # 是否继续删除
            StuDB.__whetherContinue(self, '修改')


# 功能菜单
def menu():
    print("============学生信息管理系统==============\n"
          "|                                    |\n"
          "| ==============功能菜单==============|\n"
          "|                                    |\n"
          "|                                    |\n"
          "|          1、录入学生信息              |\n"
          "|          2、查找学生信息              |\n"
          "|          3、删除学生信息              |\n"
          "|          4、修改学生信息              |\n"
          "|          5、查询所有学生信息           |\n"
          "|          6、各门课程平均分             |\n"
          "|          7、各门课程最高分             |\n"
          "|          8、各门课程最低分             |\n"
          "|          9、导入                     |\n"
          "|          10、导出                    |\n"
          "|          0、退出系统                 |\n"
          "|                                    |\n"
          "|                                    |\n"
          "|                                    |\n"
          "|------------------------------------|\n"
          "|                                    |\n"
          "|                                    |\n"
          )


if __name__ == '__main__':
    stu = StuDB()
    stu.initStudentTable()
    ctrl = True
    while ctrl:
        # 打印菜单
        menu()
        # 获取输入
        option = input("请选择:")
        # 正则表达式匹配数字
        option_str = re.sub("\D", "", option)
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']:
            option_int = int(option_str)
            if option_int == 0:  # 退出系统
                print('您已退出学生信息管理系统!')
                ctrl = False
            elif option_int == 1:  # 录入学生成绩信息
                stu.insertStudent()
                time.sleep(3)
            elif option_int == 2:  # 查找学生成绩信息
                stu.selectStudentById()
                time.sleep(3)
            elif option_int == 3:  # 删除学生成绩信息
                stu.deleteStudentById()
                time.sleep(3)
            elif option_int == 4:  # 修改学生成绩信息
                stu.updateStudentById()
                time.sleep(3)
            elif option_int == 5:  # 查询所有学生信息
                stu.selectStudentAll()
                time.sleep(3)
            elif option_int == 6:  # 各门课程平均分
                stu.scoreAvg()
                time.sleep(3)
            elif option_int == 7:  # 各门课程最高分
                stu.scoreMax()
                time.sleep(3)
            elif option_int == 8:  # 各门课程最低分
                stu.scoreMin()
                time.sleep(3)
            elif option_int == 9:  # 导入数据
                stu.load()
                time.sleep(3)
            elif option_int == 10:  # 导出数据
                stu.save()
                time.sleep(3)
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值