python是一门解释性和面向对象的编程语言,可应用于许多生活和工作场景,满足人们不同的需要。MySQL是一个开源免费的关系型数据库,深受用户和企业信赖。但是建立数据库(或表)和使用操作数据库有点繁杂,我们是否可以都在脚本编写中实现这些操作,并且很方便应用于我们的程序功能和代码中,答案是可以的!
接下来,我们将利用python和它的一个具有ORM(对象关系映射)的库来建立数据库表模型和在脚本简便地操纵数据库,并开发一个很实在的应用!
但是由于这个是初始版本(第一个版本),所以功能实现和结构上不追求尽善尽美,但是也是对于初学者来说或初始版本来说还是不错的,另外,希望读者继续关注笔者,已更新和呈现更好地功能完善的版本给受众!
对于许多初学者或大学专业学习一门基础的编程语言时都会要求编写一个学生成绩(或信息)管理系统,另外,无论是为了作业还是兴趣,编写一个实际的应用都会极大地增加你的编程能力和成就感,所以这个博文即可以当做你的(python语言)作业参考或开发这样一个应用的指导!
知识要求或配置储备 | 备注 |
---|---|
python基础语法 | 由于是初始版本,所以只利用简单明了的python语法来编写,保证通俗易懂,这也可以验证自己的学习成果 |
SQLAlchemy库 | 这个是python的一个库,能够满足构建面向对象的python和关系型数据库的桥梁,从而实现简洁的操作数据库中的数据,另外,我们还可以利用对应的SQL操作语句来操作数据,所以原生语言和本地SQLAlchemy方言(自己的函数和方法)两者兼用,要学习下基本的使用方法 |
pymysql库 | 由于SQLAlchemy是默认使用 SQLite 数据库,而我们使用的是MySQL,所以要下载这个库,最好掌握一些使用方法 |
mysql基本使用 | 虽然可以很方便地建立数据表和使用简洁的SQLAlchemy函数方法操作数据库数据(代替了繁杂原生的数据库操作),但是在一些功能实现上还是用原生语言操作数据库会很方便,因为SQLAlchemy实现某些功能时所用的函数和方法会很繁杂,所以还是要掌握基本的MySQL操作语句 |
mysql数据库 | 安装好数据库,并且设置好登录密码和账户名,并在MySQL中新建一个数据库(database),名称可自定义 |
GITHub | 最好能够访问和使用GIThub,因为我会把这个系统的文件上传的GitHub,以便大家学习,但是也会在CSDN上传项目的压缩包 |
关于学习和开发中的疑难和解决方法会放在该博文的问题和学习汇总模块,如果需要文章后面学习!
库包文件支持(本次开始时采用的是虚拟环境,读者可自由选择)
from models import STU#引入STU类,便于使用事物session操作
from __init__ import session,engine#__init__为同目录下的数据库配置和连接模块
def stu_information(): # 输入和保存学生相关信息的函数,此为该系统的重要数据部分
name = input("请输入该学生的姓名:")
number = input("请输入该学生的学号:")
math = input("请输入该学生的数学成绩:")
chinese = input("请输入该学生的语文成绩:")
english = input("请输入该学生的英语成绩:")
user = STU(name=name, number=number, math=math, chinese=chinese, english=english)#左边的name是数据库(模型类)对应的列名name,右边name是我们input收集的变量
session.add(user)
session.commit()
print('>>添加成功!\n')
def stu_change(): # 修改单个学生信息功能的函数
numbers = input("请输入该学生的学号:")
users = session.query(STU).filter_by(number=numbers).first()#先查找出对应学号的对象,在重新添加信息覆盖之前的信息,达到修改的目的
users.name = input("请输入该学生的姓名:")
users.math = input("请输入该学生的数学成绩:")
users.chinese = input("请输入该学生的语文成绩:")
users.english = input("请输入该学生的英语成绩:")
session.add(users)
session.commit()
return
def stu_delete(): # 删除相关信息功能的函数
numbers = eval(input("请输入要删除学生信息的序号:"))
result=session.query(STU).filter_by(number=numbers).first()
if result != None:#若返回对象不为为空,继续删除操作
session.delete(result)
session.commit()
print('>>删除成功')
else:
print('>>查无此人或你的输入有误!')
def stu_check(): # 查找相关信息的函数
numbers = input("请输入要查询学生信息的序号:")
result=session.query(STU).filter_by(number=numbers).first()
if result != None:
print('-' * 56)
print('|{0:^22}|{1:^6}|{2:^6}|{3:^5}|{4:^5}|'.format('姓名', '学号', '数学', '语文', '英语'))
print('-' * 56)
print('|{0:^20}\t|{1:^6}\t|{2:^6}\t|{3:^6}\t|{4:^6}|'.format(result.name, result.number, result.math,result.chinese, result.english))
print('-' * 56)
else:
print('>>查无此人或你的输入有误!')
def stu_all(*b): # 显示该系统中的所有学生信息数据
all_result=session.query(STU).all()
print('<全部学生成绩表>' .center(52,'—'))
print('|{0:^22}|{1:^6}|{2:^6}|{3:^5}|{4:^5}|'.format('姓名','学号','数学','语文','英语'))#为了输出效果上构成一个表,输出格式进行了对应的调整
print('-' * 56)#该表的横线分隔部分是由‘-’构成,如果想用其他符号也可(+=)
for i in all_result:
print('|{0:^20}\t|{1:^6}\t|{2:^6}\t|{3:^6}\t|{4:^6}|'.format(i.name, i.number, i.math, i.chinese,i.english))
print('-' * 56)
print(">>已显示系统内所有人的信息!\n")
def stu_rank(): # 排序不同类型成绩的函数
lists=[]#用于存储转换后的单个信息列表的列表
rank_count=0#用于排名表遍历输出次序设定的初始值
rank_result=engine.execute('select *,(math+chinese+english) 总成绩 from stu order by 总成绩 desc')#返回多个元组构成的结果,包含各个信息和总分
for i in rank_result:
p=list(i)#将单个元组转换成列表(数组),便于后面索引得到想要的数据
lists.append(p)
print('<总分排名表>'.center(70,'='))#该表的横线分隔部分是由‘=’构成,如果想用其他符号也可(+-),不过实验过对于这个表这种效果比较好
print('|{0:^22}|{1:^6}|{2:^6}|{3:^5}|{4:^5}|{5:^8}|{6:^5}|'.format('姓名','学号','数学','语文','英语','总分','排名'))
print('=' * 73)
for k in lists:
rank_count+=1#每次遍历按总分降序出来的列表,遍历时记录操作,赋予对应的排名值
print('|{0:^20}\t|{1:^6}\t|{2:^6}\t|{3:^6}\t|{4:^6}|{5:^9}|{6:^6}|'.format(k[1],k[2],k[3],k[4],k[5],k[6],rank_count))
print('=' * 73)
print(">>已显示系统内所有人的总分排名信息!\n")
while True: # while循环使功能主界面能一直供用户使用,直到用户不需要为止
print('学生成绩管理系统,请选择系统功能'.center(71,'-'))#功能选项也是在一个方框内
print('{0:<3}{1:<72}\t{2:>}'.format('|','1.输入学生信息;','|'))
print('{0:<3}{1:<69}\t{2:>}'.format('|','2.修改学生的相关信息;','|'))
print('{0:<3}{1:<69}\t{2:>}'.format('|','3.删除学生的相关信息;','|'))
print('{0:<3}{1:<69}\t{2:>}'.format('|','4.查询学生信息;','|'))
print('{0:<3}{1:<69}\t{2:>}'.format('|','5.显示所有学生的信息;','|'))
print('{0:<3}{1:<72}\t{2:>}'.format('|','6.学生成绩排序;','|'))
print('{0:<3}{1:<72}\t{2:>}'.format('|','0.退出程序;','|'))
print('-'*80,'\n')
select = input("请输入你的功能选择>>")
if select == '1':
stu_information() # 函数调用或传参使用
elif select == '2':
stu_change() #同上
elif select == '3':
stu_delete()
elif select == '4':
stu_check()
elif select == '5':
stu_all()
elif select == '6':
stu_rank()
elif select == '0':
print('\n','本系统版本:version1.0'.center(65,'-'))
print("感谢你的使用!!!祝你考试旗开得胜!!!")
print("开发者:SteveDraw,么么哒^_^")
print('-'*70)
break
else:
print(">>你的输入错误!请按照提示重新输入!\n") # 错误输入格式提醒
continue
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import db#models为同目录下的数据库模型模块文件
engine=create_engine('mysql+pymysql://root:<你的mysql登录密码>@localhost/sqltest')#数据库连接引擎,根据自己所选的数据库配置即可
DbSession = sessionmaker(bind=engine)
session = DbSession()#session用于创建程序和数据库之间的会话,所有对象的载入和保存都需要通过session对象
db.metadata.create_all(engine)#创建数据表,原本存在即忽略
from sqlalchemy import Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base
db=declarative_base()#这个是sqlalchemy内部封装的一个方法,通过其构造一个基类,这个基类和它的子类,可以将Python类和数据库表关联映射起来
class STU(db):#在所选定的数据库,利用这个类模型建立数据表,并定义其中的类属性对应表中的字段属性
__tablename__='stu'#将该表命名为stu
id=Column(Integer,primary_key=True)#数据表的内置的序号,按输入顺序排的,作为关系表的主键
name=Column(String(64))#
number=Column(Integer,unique=True)#由于学号是唯一的,并且我们以学号作为搜索的参考,所以用unique设为True,不能重复该值
math=Column(Integer)
chinese=Column(Integer)
english=Column(Integer)
以上三个文件都是同目录下的文件,注意下位置关系!
运行流程:
0.建立好mysql数据库(即对应使用的数据库)
1.先建立编写好的models.py;
2.再运行编写好的配置初始文件__init__.py文件;
3.再运行主程序app.py文件
功能模块 | 描述 |
---|---|
主界面 | 输入提示对应的数字,即可实现对应的功能 |
输入学生信息 | 选择该功能后,依次根据输入提示,输入相关信息,即可完成操作 |
修改学生的相关信息 | 以学号为查询的条件,修改除学号的其他信息 |
删除学生的相关信息 | 以学号为查询的条件,删除该学号的对应的同学的所有信息(包括该学号) |
查询学生信息 | 以学号为查询的条件,即可返回对应同学的信息 |
显示所有学生的信息 | 选择该功能后,即可出现所有学生的成绩汇总,表格样式做了调整,使其和正常的表格样式一样,提高可阅读性 |
学生成绩排序 | 选择该功能后,即可出现根据总分排名的全部学生的排名表 |
退出程序 | 选择该功能后,结束系统的运行,并且出现相应的界面内容 |
系统优点 | 系统缺点 |
---|---|
1.能比较地方便利用数据库模型建立数据表; | 1.由于是初始版本,并且在运行窗口下交互,所以,一些运行错误检查还不完善; |
2.利用python语言及SQLAlchemy库能较好地操作数据库数据和数据库交互; | 2.如果主程序函数运行太久,可能由于电脑原因,再次操作会没反应,不过问题不大; |
3.最基本的学生信息管理系统功能都实现了,另外,代码结构及调用也比较简单; | 3.数据信息还比较简陋,分析功能还略差,以后更新版本来拓展的; |
4.输出界面时模仿表格样式和结构,可读性大大增强 | 4.无数据库迁移拓展,以后的版本会拓展的; |
SQLAlchemy使用文档
Python SQLAlchemy入门教程
Python操作MySql——使用SQLAlchemy ORM操作数据库
Python操作MySQL之SQLAlchemy
Windows平台下MySQL的安装和基本命令行使用
基于python语言的成绩管理系统(无数据库版本)
文件压缩包下载
GitHub项目地址
--------------------------------------------------最后,文中如有不足,敬请批评指正!------------------------------------------------------------