目录
功能模块:
运行功能演示:
具体代码实现过程:
创建sqlite 数据库
Python代码
引入os和sqlite3包:
初始化数据库:
连接数据库:
关闭并提交数据到数据库:
查询数据并显示:
添加并插入数据到数据库:
更新数据到数据库:
删除数据并更新数据库:
导入和导出数据
学生成绩统计:
关联数据库文件:
本文为在之前学生信息及成绩管理系统(Python)完整版的基础上增加数据库功能,数据库我们直接使用并连接Sqlite。
学生信息管理系统(Python)完整版_python学生信息管理系统_李威威wiwi的博客-CSDN博客基本信息管理和学生成绩管理。基本信息管理模块的主要功能有学生信息的添加、删除、修改、显示和学生数据的导入导出,学生成绩管理模块的主要功能有统计课程最高分、最低分和平均分。https://blog.csdn.net/agelee/article/details/126832608
核心功能模块如下:
学生信息管理系统启动后,首先进入系统主界面,等待用户输入命令选择相应的功能。
如果用户输入“info”命令,则进入学生基本信息管理子功能模块。
在学生基本信息管理界面,用户通过输入相应的命令进行学生基本信息的增、删、改、显示等操作。
学生基本信息菜单
添加学生信息
删除学生信息
修改学生信息
显示学生信息
如果用户输入“score”命令,则进入学生成绩管理子功能模块。
在学生成绩管理界面用户可选择相应的功能进行成绩处理。
平均分:
最高分
最低分
直接在Pycharm中创建一个sqlite 数据库,名字为StuDB。
name 和File都填StuDB。
成功创建数据库
新建 Python文件:学生信息管理(sqlite).py
import os
import sqlite3
定义一个主类:StuDB,然后在类里面实现具体的功能函数。
def __init__(self):
self.con = ''
self.cur = ''
def connect(self,db):
self.con = sqlite3.connect(db)
self.cur = self.con.cursor()
try:
sql = '''
create table student (
no text,
name text,
chinese integer,
math integer,
english integer )
'''
self.cur.execute(sql)
except:
pass
def close(self):
self.con.commit()
self.cur.close()
self.con.close()
def show(self):
format_head = '{:8}\t{:8}\t{:8}\t{:8}\t{:8}'
print(format_head.format('学号','姓名','语文','数学','英语'))
sql = 'select * from student'
self.cur.execute(sql)
rows = self.cur.fetchall()
format_con = '{:8}\t{:8}\t{:<8}\t{:<8}\t{:<8}'
for row in rows:
print(format_con.format(row[0],row[1],row[2],row[3],row[4]))
def __insert(self,no,name,chinese,math,english):
sql='insert into student(no,name,chinese,math,english) values(?,?,?,?,?)'
self.cur.execute(sql,(no,name,chinese,math,english))
if self.cur.rowcount > 0:
print('插入成功')
else:
print('插入失败')
def insert(self):
while True:
no = input('学号:')
if self.__exists(no):
print('该学号已存在')
else:
name = input('姓名:')
chinese = self.__enterScore('语文成绩:')
math = self.__enterScore('数学成绩:')
english = self.__enterScore('英语成绩:')
if no != '' and name != '':
self.__insert(no,name,chinese,math,english)
else:
print('请将信息输入完整')
choice = input('继续添加(y/n)?').lower()
if choice == 'n':
break
def __update(self,no,name,chinese,math,english):
sql='update student set name=?,chinese=?,math=?,english=? where no=?'
self.cur.execute(sql,(name,chinese,math,english,no))
if self.cur.rowcount > 0:
print('修改成功')
else:
print('修改失败')
def update(self):
while True:
no = input('请输入要修改的学号:')
if not self.__exists(no):
print('该学号不存在')
else:
name = input('姓名:')
chinese = self.__enterScore('语文成绩:')
math = self.__enterScore('数学成绩:')
english = self.__enterScore('英语成绩:')
if no != '' and name != '' :
self.__update(no,name,chinese,math,english)
else:
print('请将信息输入完整')
choice = input('继续修改(y/n)?').lower()
if choice == 'n':
break
def __delete(self,no):
sql = 'delete from student where no = ?'
self.cur.execute(sql,(no,))
if self.cur.rowcount > 0:
print('删除成功')
else:
print('删除失败')
def delete(self):
while True:
no = input('请输入要删除的学号:')
if not self.__exists(no):
print('该学号不存在')
else:
self.__delete(no)
choice = input('继续删除(y/n)?').lower()
if choice == 'n':
break
def save(self):
fn = input('请输入要导出的文件名:')
with open(fn,'w',encoding = 'utf-8') as fp:
self.cur.execute('select * from student')
rows = self.cur.fetchall()
for row in rows:
fp.write(row[0] + ',' )
fp.write(row[1] + ',' )
fp.write(str(row[2]) + ',' )
fp.write(str(row[3]) + ',' )
fp.write(str(row[4])+ '\n')
print('导出完毕')
def load(self):
fn = input('请输入要导入的文件名:')
if os.path.exists(fn):
with open(fn,'r',encoding = 'utf-8') as fp:
while True:
s = fp.readline().strip('\n')
if s == '':
break
stu = s.split(',')
no = stu[0]
name = stu[1]
chinese = int(stu[2])
math = int(stu[3])
english = int(stu[4])
if self.__exists(no):
print('该学生已存在')
else:
self.__insert(no,name,chinese,math,english)
print('导入完毕')
else:
print('要导入的文件不存在')
def scoreavg(self):
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):
sql = 'select max(chinese),max(math),max(english) from student'
self.cur.execute(sql)
result = self.cur.fetchone()
print('语文成绩最高分是:%d'%result[0])
print('数学成绩最高分是:%d'%result[1])
print('英语成绩最高分是:%d'%result[2])
def scoremin(self):
sql = 'select min(chinese),min(math),min(english) from student'
self.cur.execute(sql)
result = self.cur.fetchone()
print('语文成绩最低分是:%d'%result[0])
print('数学成绩最低分是:%d'%result[1])
print('英语成绩最低分是:%d'%result[2])
def main(self,db):
while True:
print('学生信息管理系统(数据库版)'.center(20,'='))
print('info -------学生基本信息管理')
print('score -------学生成绩统计')
print('exit -------退出系统')
print(''.center(32,'='))
s = input('main>').strip().lower()
if s == 'info':
self.infoprocess(db)
elif s == 'score':
self.scoreprocess(db)
elif s == 'exit':
break
else:
print('输入错误')
def infoprocess(self,db):
self.connect(db)
print('学生基本信息管理'.center(24,'='))
print('load -----------导入学生数据')
print('insert -----------插入学生信息')
print('delete -----------删除学生信息')
print('update -----------修改学生信息')
print('show -----------显示学生信息')
print('save -----------导出学生数据')
print('return -----------返回并更新数据库')
print(''.center(32,'='))
while True:
s = input('info>').strip().lower()
if s == 'load':
self.load()
elif s == 'insert':
self.insert()
elif s == 'delete':
self.delete()
elif s == 'update':
self.update()
elif s == 'show':
self.show()
elif s == 'save':
self.save()
elif s =='return':
break
else:
print('输入错误')
self.close()
def scoreprocess(self,db):
self.connect(db)
print('学生成绩统计'.center(24,'='))
print('avg --------课程平均分')
print('max --------课程最高分')
print('min --------课程最低分')
print('return --------返回')
print(''.center(30,'='))
while True:
s = input('score>').strip().lower()
if s == 'avg':
self.scoreavg()
elif s == 'max':
self.scoremax()
elif s == 'min':
self.scoremin()
elif s == 'return':
break
else:
print('输入错误')
self.close()
最后单独定义函数指定本次连接的数据库的文件地址。
if __name__ == '__main__':
sd = StuDB()
sd.main('数据库文件夹路径\StuDB')
import os
import sqlite3
class StuDB:
def __init__(self):
self.con = ''
self.cur = ''
def connect(self,db):
self.con = sqlite3.connect(db)
self.cur = self.con.cursor()
try:
sql = '''
create table student (
no text,
name text,
chinese integer,
math integer,
english integer )
'''
self.cur.execute(sql)
except:
pass
def close(self):
self.con.commit()
self.cur.close()
self.con.close()
def show(self):
format_head = '{:8}\t{:8}\t{:8}\t{:8}\t{:8}'
print(format_head.format('学号','姓名','语文','数学','英语'))
sql = 'select * from student'
self.cur.execute(sql)
rows = self.cur.fetchall()
format_con = '{:8}\t{:8}\t{:<8}\t{:<8}\t{:<8}'
for row in rows:
print(format_con.format(row[0],row[1],row[2],row[3],row[4]))
def __enterScore(self,message):
while True:
try:
score = input(message)
if 0 <= int(score) <= 100:
break
else:
print('输入错误,成绩应在0到100之间')
except:
print('输入错误,成绩应在0到100之间')
return int(score)
def __exists(self,no):
sql = 'select * from student where no = ?'
result = self.cur.execute(sql,(no,))
rows = result.fetchall()
if len(rows) > 0:
return True
else:
return False
def __insert(self,no,name,chinese,math,english):
sql='insert into student(no,name,chinese,math,english) values(?,?,?,?,?)'
self.cur.execute(sql,(no,name,chinese,math,english))
if self.cur.rowcount > 0:
print('插入成功')
else:
print('插入失败')
def __update(self,no,name,chinese,math,english):
sql='update student set name=?,chinese=?,math=?,english=? where no=?'
self.cur.execute(sql,(name,chinese,math,english,no))
if self.cur.rowcount > 0:
print('修改成功')
else:
print('修改失败')
def __delete(self,no):
sql = 'delete from student where no = ?'
self.cur.execute(sql,(no,))
if self.cur.rowcount > 0:
print('删除成功')
else:
print('删除失败')
def insert(self):
while True:
no = input('学号:')
if self.__exists(no):
print('该学号已存在')
else:
name = input('姓名:')
chinese = self.__enterScore('语文成绩:')
math = self.__enterScore('数学成绩:')
english = self.__enterScore('英语成绩:')
if no != '' and name != '':
self.__insert(no,name,chinese,math,english)
else:
print('请将信息输入完整')
choice = input('继续添加(y/n)?').lower()
if choice == 'n':
break
def delete(self):
while True:
no = input('请输入要删除的学号:')
if not self.__exists(no):
print('该学号不存在')
else:
self.__delete(no)
choice = input('继续删除(y/n)?').lower()
if choice == 'n':
break
def update(self):
while True:
no = input('请输入要修改的学号:')
if not self.__exists(no):
print('该学号不存在')
else:
name = input('姓名:')
chinese = self.__enterScore('语文成绩:')
math = self.__enterScore('数学成绩:')
english = self.__enterScore('英语成绩:')
if no != '' and name != '' :
self.__update(no,name,chinese,math,english)
else:
print('请将信息输入完整')
choice = input('继续修改(y/n)?').lower()
if choice == 'n':
break
def save(self):
fn = input('请输入要导出的文件名:')
with open(fn,'w',encoding = 'utf-8') as fp:
self.cur.execute('select * from student')
rows = self.cur.fetchall()
for row in rows:
fp.write(row[0] + ',' )
fp.write(row[1] + ',' )
fp.write(str(row[2]) + ',' )
fp.write(str(row[3]) + ',' )
fp.write(str(row[4])+ '\n')
print('导出完毕')
def load(self):
fn = input('请输入要导入的文件名:')
if os.path.exists(fn):
with open(fn,'r',encoding = 'utf-8') as fp:
while True:
s = fp.readline().strip('\n')
if s == '':
break
stu = s.split(',')
no = stu[0]
name = stu[1]
chinese = int(stu[2])
math = int(stu[3])
english = int(stu[4])
if self.__exists(no):
print('该学生已存在')
else:
self.__insert(no,name,chinese,math,english)
print('导入完毕')
else:
print('要导入的文件不存在')
def scoreavg(self):
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):
sql = 'select max(chinese),max(math),max(english) from student'
self.cur.execute(sql)
result = self.cur.fetchone()
print('语文成绩最高分是:%d'%result[0])
print('数学成绩最高分是:%d'%result[1])
print('英语成绩最高分是:%d'%result[2])
def scoremin(self):
sql = 'select min(chinese),min(math),min(english) from student'
self.cur.execute(sql)
result = self.cur.fetchone()
print('语文成绩最低分是:%d'%result[0])
print('数学成绩最低分是:%d'%result[1])
print('英语成绩最低分是:%d'%result[2])
def main(self,db):
while True:
print('学生信息管理系统(数据库版)'.center(20,'='))
print('info -------学生基本信息管理')
print('score -------学生成绩统计')
print('exit -------退出系统')
print(''.center(32,'='))
s = input('main>').strip().lower()
if s == 'info':
self.infoprocess(db)
elif s == 'score':
self.scoreprocess(db)
elif s == 'exit':
break
else:
print('输入错误')
def infoprocess(self,db):
self.connect(db)
print('学生基本信息管理'.center(24,'='))
print('load -----------导入学生数据')
print('insert -----------插入学生信息')
print('delete -----------删除学生信息')
print('update -----------修改学生信息')
print('show -----------显示学生信息')
print('save -----------导出学生数据')
print('return -----------返回并更新数据库')
print(''.center(32,'='))
while True:
s = input('info>').strip().lower()
if s == 'load':
self.load()
elif s == 'insert':
self.insert()
elif s == 'delete':
self.delete()
elif s == 'update':
self.update()
elif s == 'show':
self.show()
elif s == 'save':
self.save()
elif s =='return':
break
else:
print('输入错误')
self.close()
def scoreprocess(self,db):
self.connect(db)
print('学生成绩统计'.center(24,'='))
print('avg --------课程平均分')
print('max --------课程最高分')
print('min --------课程最低分')
print('return --------返回')
print(''.center(30,'='))
while True:
s = input('score>').strip().lower()
if s == 'avg':
self.scoreavg()
elif s == 'max':
self.scoremax()
elif s == 'min':
self.scoremin()
elif s == 'return':
break
else:
print('输入错误')
self.close()
if __name__ == '__main__':
sd = StuDB()
sd.main('数据库所在文件夹\StuDB')