sqlalchemy-orm学生签到 成绩记录查询系统
#!/usr/bin/env python
# Author:zhangmingda
''''''
from sqlalchemy import create_engine,ForeignKey,DATE,Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship,sessionmaker
engine = create_engine("mysql+pymysql://zhangmingda:Wyf@1314@120.92.133.227/stu_record_project?charset=utf8",encoding='utf8',echo=False)
'''说明:engine 如果想写入中文,在库名后面加入?charset=utf8 encoding=utf-8 不起作用'''
'''生成基类'''
Base = declarative_base()
#'''此表只存老师id和class id的对应关系'''
teacher_m2m_classes = Table(
'teacher_m2m_classes', Base.metadata,
Column('teacher_id', Integer, ForeignKey('teachers.id')),
Column('class_id', Integer, ForeignKey('classes.id'))
)
#'''此表表示课节和班级的对应关系:一节课可能多个班级同时上'''
lessons_m2m_classes = Table(
'lessons_m2m_classes',Base.metadata,
Column('lesson_id',Integer,ForeignKey('lessons.id')),
Column('class_id',Integer,ForeignKey('classes.id'))
)
#'''此表表示学生和班级的对应关系:一个班级多个学生,一个学生也可能报多个班'''
students_m2m_classes = Table(
'students_m2m_classes', Base.metadata,
Column('student_id', Integer, ForeignKey('students.id')),
Column('class_id', Integer, ForeignKey('classes.id'))
) class Teacher(Base):
'''老师表'''
__tablename__ = 'teachers'
__table_args__ = {'mysql_charset': 'utf8'}
id = Column(Integer,primary_key=True)
name = Column(String(64),nullable=False,unique=True)
classes = relationship('Class',secondary=teacher_m2m_classes,backref='teachers')
def __repr__(self):
return "讲师:%s"% self.name class Student(Base):
'''学生表'''
__tablename__ = 'students'
__table_args__ = {'mysql_charset': 'utf8'}
id = Column(Integer,primary_key=True)
name = Column(String(64),nullable=False)
QQ = Column(String(64),nullable=False,unique=True)
def __repr__(self):
return "学生:%s"% self.name class Class(Base):
'''班级表'''
__tablename__ = 'classes'
__table_args__ = {'mysql_charset': 'utf8'}
id = Column(Integer, primary_key=True)
name = Column(String(64), nullable=False, unique=True)
students = relationship('Student',secondary=students_m2m_classes,backref='classes')
def __repr__(self):
return self.name class Lesson(Base):
'''课节表'''
__tablename__ = 'lessons'
__table_args__ = {'mysql_charset': 'utf8'}
id = Column(Integer,primary_key=True)
name = Column(String(64), nullable=False, unique=True)
lesson_class = relationship('Class',secondary=lessons_m2m_classes,backref='lessons')
def __repr__(self):
return self.name #'课节;%s'%
class Stu_record(Base):
'''上课记录表'''
__tablename__ = 'stu_record'
__table_args__ = {'mysql_charset': 'utf8'}
id = Column(Integer,primary_key=True)
lesson_id = Column(Integer,ForeignKey('lessons.id'))
stu_id = Column(Integer,ForeignKey('students.id'))
status = Column(String(64),nullable=True)
homework = Column(String(64),nullable=True)
score = Column(Integer,nullable=True)
lessons_name = relationship('Lesson',backref='lessons_record')
student = relationship('Student',backref='lessons_record')
def __repr__(self):
return '%s 课节 学员:%s 状态:%s 成绩 :%s '%(self.lessons_name,self.student,self.status,self.score) if __name__ == '__main__':
Base.metadata.create_all(engine)
table_class
#!/usr/bin/env python
# Author:zhangmingda
import teacher_active,student_active,tables_class
from sqlalchemy.orm import sessionmaker SessionClass = sessionmaker(bind=tables_class.engine)
session = SessionClass() # teacher = teacher_active.Teacher_view(session)
# teacher.handle() student = student_active.Student_view(session)
student.handle()
main
#!/usr/bin/env python
# Author:zhangmingda
import tables_class class Teacher_view(object):
def __init__(self,session):
self.session = session
self.login_status = False
self.teacher_obj = None
# self
def auth(self):
'''简易登录认证'''
while True:
teacher_name = input('\033[34;1m请输入讲师名字:\033[0m').strip()
teacher_obj = self.session.query(tables_class.Teacher).filter_by(name=teacher_name).first()
if teacher_obj:
self.teacher_obj = teacher_obj
self.login_status = True
break
else:
continue
def handle(self):
while not self.login_status:
self.auth()
else:
while self.login_status:
print('\033[32;1m欢迎进入讲师操作界面,请输入要操作的代号:\033[0m')
menu = {
1:"创建班级",
2:"创建课节",
3:"向班级添加学员",
4:"修改学员上课记录",
5:"修改学员成绩",
6:"退出系统",
}
menu_dict = {
"1": self.create_class,
"2": self.create_lesson,
"3": self.add_student,
"4": self.modify_record,
"5": self.modify_score,
"6": 'exit'
}
for i in menu:
print(i,menu[i])
chose = input('请选择>>>').strip()
if chose in menu_dict and chose != "6" :
menu_dict[chose]()
elif chose == '6':break
else:
print('\033[31;1m您输入的代号不存在,请重新输入。\033[0m') def create_class(self):
class_name = input('\033[32;0m要创建班级名称:\033[0m').strip()
class_exist = self.session.query(tables_class.Class).filter_by(name=class_name).first()
if class_exist:
print('\033[31;1m班级名称已存在:%s\033[0m'% class_exist)
else:
class_obj = tables_class.Class(name=class_name)
self.teacher_obj.classes.append(class_obj)
self.session.add_all([class_obj])
self.session.commit()
print('\033[32;1m班级:%s创建成功\033[0m'%class_obj)
def create_lesson(self):
classes = self.teacher_obj.classes
if not classes:
print('\033[31;1m您不教任何一个班级,无法创建课程\033[0m')
else :
print('\033[32;1m您所教班级有\033[0m')
for i in classes:
print(i)
while True:
input_class = input('\033[32;1m 请输入要创建课程的班级名称>>>\033[0m').strip()
class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
if not class_obj:
print('\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m')
else:
class_lessons = class_obj.lessons
print('\033[33;1m班级:%s当前已关联课程:%s'%(class_obj,class_lessons))
lesson_name = input('\033[32;1m 输入要创建的课程名称>>> \033[0m')
lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
#课程已存在,并且已经关联该班级
if lesson_obj_exist in list(class_lessons):
print('\033[31;1m %s 下课程:%s已存在,请重新添加\033[0m'%(class_obj,lesson_obj_exist))
#'''课程已存在,但未关联该班级'''
elif lesson_obj_exist and lesson_obj_exist not in list(class_lessons): #课程表中有,但未关联班级
'''list()将sqlalchemy的对象list转为普通list,用来做in的判断'''
print('\033[31;1m 课程名:%s库中已存在\033[0m,\033[32;1m直接加入到课程%s\033[0m'%(lesson_name,class_obj))
class_obj.lessons.append(lesson_obj_exist) #将已有课程关联班级
self.session.commit()
# print('类型:',type(lesson_obj_exist),'测试',type(list(class_lessons)))
break
#课程不存在
else:
lesson_obj = tables_class.Lesson(name=lesson_name) #创建课程对象
lesson_obj.lesson_class.append(class_obj) #将课程同班级关联
self.session.add_all([lesson_obj]) #加入session
self.session.commit() #提交保存到数据库
break def add_student(self):
classes = self.teacher_obj.classes
if not classes:
print('\033[31;1m您不教任何一个班级,无法添加学生\033[0m')
else :
print('\033[32;1m您所教班级有\033[0m')
for i in classes:
print(i)
while True:
input_class = input('\033[32;1m 请输入要添加学员的班级名称>>>\033[0m').strip()
class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
if not class_obj:
print('\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m')
else:
print('%s 班 已有学员 %s'%(class_obj,class_obj.students))
input_stu = input('\033[32;1m 请输入要添加的学员QQ号码:\033[0m').strip()
stu_obj = self.session.query(tables_class.Student).filter_by(QQ=input_stu).first()
if stu_obj and stu_obj in list(class_obj.students):
print('\033[31;1m %s 已存在 %s 班'%(stu_obj,class_obj))
elif not stu_obj:
print("\033[31;1m %s 不存在\033[0m"% stu_obj)
else:
class_obj.students.append(stu_obj)
self.session.commit()
print("\033[32;1m %s 添加到 %s 成功!\033[0m"%(stu_obj,class_obj))
break
pass
def modify_record(self):
classes = self.teacher_obj.classes
if not classes:
print('\033[31;1m您不教任何一个班级,无法添加上课记录\033[0m')
else:
print('\033[32;1m您所教班级有\033[0m')
for i in classes:
print(i.id,i)
while True:
input_class_id = input('\033[32;1m 请选择班级名称代号>>>\033[0m').strip()
class_obj = self.session.query(tables_class.Class).filter_by(id=input_class_id).first()
if not class_obj:
print('\033[31;1m 输入的班级代号不存在,请重新输入。\033[0m')
# continue
else:
while True:
print('%s 班 已有课程 %s' % (class_obj, class_obj.lessons))
chose_lesson = input('\033[32;1m 请选择课程\033[0m')
lesson_obj = self.session.query(tables_class.Lesson).filter_by(name=chose_lesson).first()
if lesson_obj in list(class_obj.lessons):
print('\033[32;1m %s 学生有:%s\033[0m'%(class_obj,class_obj.students))
for stu in list(class_obj.students):
status = input('%s %s %s QQ:%s 打卡状态》:'%(class_obj,lesson_obj,stu,stu.QQ)).strip()
if not status:
print('跳过 :%s'% stu)
continue
else:
record_obj = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_obj.id,
stu_id=stu.id).first()
if record_obj:
record_obj.status = status
self.session.commit()
print('\033[33;1m 已有该学生记录,修改签到状态提交成功!\033[0m')
# break
else:
record_obj = tables_class.Stu_record(lesson_id=lesson_obj.id, stu_id=stu.id,
status=status)
self.session.add_all([record_obj]) # 加入session
self.session.commit() # 提交保存到数据库
print('\033[33;1m 新建签到状态提交成功!!\033[0m')
print('\033[32;1m 所有学生签到状态修改完成\033[0m');break
else:
print('\033[31; 您选择的课程不存在该班级中\033[0m') break pass
def modify_score(self):
classes = self.teacher_obj.classes
if not classes:
print('\033[31;1m您不教任何一个班级,无法添加上课记录\033[0m')
else:
print('\033[32;1m您所教班级有\033[0m')
for i in classes:
print(i.id, i)
while True:
input_class_id = input('\033[32;1m 请选择班级名称代号,修改成绩>>>\033[0m').strip()
class_obj = self.session.query(tables_class.Class).filter_by(id=input_class_id).first()
if not class_obj:
print('\033[31;1m 输入的班级代号不存在,请重新输入。\033[0m')
# continue
else:
while True:
print('%s 班 已有课程 %s' % (class_obj, class_obj.lessons))
chose_lesson = input('\033[32;1m 请选择课程\033[0m')
lesson_obj = self.session.query(tables_class.Lesson).filter_by(name=chose_lesson).first()
if lesson_obj in list(class_obj.lessons):
print('\033[32;1m %s 学生有:%s\033[0m' % (class_obj, class_obj.students))
for stu in list(class_obj.students):
score = input('%s %s %s QQ:%s 输入成绩:' % (class_obj, lesson_obj, stu, stu.QQ)).strip()
if not score:
print('跳过 :%s' % stu)
continue
else:
record_obj = self.session.query(tables_class.Stu_record).filter_by(
lesson_id=lesson_obj.id,
stu_id=stu.id).first()
if record_obj:
record_obj.score = score
self.session.commit()
print('\033[33;1m 已有该学生记录,修改学生成绩提交成功!\033[0m')
# break
else:
record_obj = tables_class.Stu_record(lesson_id=lesson_obj.id, stu_id=stu.id,
score=score)
self.session.add_all([record_obj]) # 加入session
self.session.commit() # 提交保存到数据库
print('\033[33;1m 新建学生成绩提交成功!!\033[0m')
print('\033[32;1m 所有学生成绩提交完成\033[0m');break
else:
print('\033[31; 您选择的课程不存在该班级中\033[0m') break
pass
teacher_active
#!/usr/bin/env python
# Author:zhangmingda
import tables_class class Student_view(object):
def __init__(self,session):
self.session = session
self.login_status = False
self.student_obj = None
def sign_up(self):
name = input('\033[32;0m创建您的用户名:\033[0m ').strip()
QQ = input('\033[32;0m输入您的QQ号码:\033[0m ')
stu_obj = tables_class.Student(name=name,QQ=QQ)
stu_exist = self.session.query(tables_class.Student).filter_by(QQ=QQ).first()
if stu_exist:
print('\033[31;1m%s 已存在 QQ:%s\033[0m'%(stu_exist,stu_exist.QQ))
else:
print('库里没这QQ号的个人,开始创建')
self.session.add(stu_obj)
self.session.commit()
print('\033[32;1m %s 创建成功\033[0m'% stu_obj) def auth(func):
'''简易登录认证装饰器'''
def wapper(*args,**kwargs):
self = args[0] #将实例自己本身获取到
while not self.login_status:
student_name = input('\033[34;1m请输入学生名字:\033[0m').strip()
QQ = input('\033[34;1m请输入QQ号码:\033[0m').strip()
student_obj = self.session.query(tables_class.Student).filter_by(name=student_name,QQ=QQ).first()
if student_obj:
self.student_obj = student_obj
self.login_status = True
func(self)
break
else:
print('\033[31;1m 用户不存在\033[0m')
else:
func(self)
return wapper @auth
def hand_in_homework(self): classes = self.student_obj.classes
if not classes:
print('\033[31;1m您未加入任何班级,无法交作业\033[0m')
else :
print('\033[32;1m您已报培训班\033[0m')
for i in classes:
print(i)
while True:
input_class = input('\033[32;1m 请输入要交作业的班级名称>>>\033[0m').strip()
class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
if not class_obj:
print('\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m')
else:
class_lessons = class_obj.lessons
print('\033[33;1m班级:%s当前已关联课程:%s'%(class_obj,class_lessons))
lesson_name = input('\033[32;1m 输入要交作业的课程名称>>> \033[0m')
lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
#课程已存在,并且已经关联该班级
if lesson_obj_exist in list(class_lessons):
lesson_id = lesson_obj_exist.id
stu_id = self.student_obj.id
homework = 'Already Submit'
record_obj = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_id,stu_id=stu_id).first()
if record_obj:
record_obj.homework = homework
self.session.commit()
print('\033[33;1m 作业提交成功!\033[0m')
break
else:
record_obj = tables_class.Stu_record(lesson_id=lesson_id,stu_id=stu_id,homework=homework)
self.session.add_all([record_obj]) #加入session
self.session.commit() #提交保存到数据库
print('\033[33;1m 作业提交成功!\033[0m')
break @auth
def show_score(self):
classes = self.student_obj.classes
if not classes:
print('\033[31;1m您未加入任何班级,无法查看成绩\033[0m')
else:
print('\033[32;1m您已报培训班\033[0m')
for i in classes:
print(i)
while True:
input_class = input('\033[32;1m 请输入要查看成绩的班级名称>>>\033[0m').strip()
class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
if not class_obj:
print('\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m')
else:
class_lessons = class_obj.lessons
print('\033[33;1m班级:%s当前已关联课程:%s' % (class_obj, class_lessons))
lesson_name = input('\033[32;1m 输入要查看成绩的课程名称,查看全部输入:all>>> \033[0m')
lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
# 课程已存在,并且已经关联该班级
if lesson_obj_exist in list(class_lessons):
lesson_id = lesson_obj_exist.id
stu_id = self.student_obj.id
stu_record_obj = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_id,stu_id=stu_id).first()
# print('\033[32;1m%s %s 成绩:%s\033[0m'% (self.student_obj,lesson_obj_exist,stu_record_obj.score))
print(stu_record_obj)
break
elif lesson_name == 'all':
print('\033[32;1m 您 %s 全部课程成绩如下 \033[0m'% class_obj)
stu_record_obj_all = self.session.query(tables_class.Stu_record).filter_by(stu_id=self.student_obj.id).all()
for stu_record_obj in stu_record_obj_all:
if stu_record_obj.lessons_name in list(class_lessons):
print(stu_record_obj)
break
else:
print('\033[31 您输入的课程不存在\033[0m')
@auth
def show_ranking(self):
classes = self.student_obj.classes
if not classes:
print('\033[31;1m您未加入任何班级,无法查看成绩排名\033[0m')
else:
print('\033[32;1m您已报培训班\033[0m')
for i in classes:
print(i)
while True:
input_class = input('\033[32;1m 请输入要查看成绩的班级名称>>>\033[0m').strip()
class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
if not class_obj:
print('\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m')
else:
class_lessons = class_obj.lessons
print('\033[33;1m班级:%s当前已关联课程:%s' % (class_obj, class_lessons))
lesson_name = input('\033[32;1m 输入要查看成绩的课程名称>>> \033[0m')
lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
if lesson_obj_exist in list(class_lessons):
students_score = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_obj_exist.id).order_by(tables_class.Stu_record.score.desc()).all()
students_score_list = list(students_score)
for ranking,score_obj in enumerate(students_score_list,1):
if score_obj.stu_id == self.student_obj.id:
print('\033[32;1m 您在 %s %s 中排第%s名\033[0m'%(class_obj,lesson_obj_exist,ranking))
break
else:
print('\033[31 您输入的课程不存在\033[0m') def handle(self):
while True:
print('\033[32;1m欢迎进入学生操作界面,请输入要操作的代号:\033[0m')
menu = {
1:"注册",
2:"交作业",
3:"查看成绩",
4:"查看排名",
5:"退出系统"
}
menu_dict = {
"1": self.sign_up,
"2": self.hand_in_homework,
"3": self.show_score,
"4": self.show_ranking,
"5": 'exit'
}
for i in menu:
print(i,menu[i])
chose = input('请选择>>>').strip()
if chose in menu_dict and chose != "5" :
menu_dict[chose]()
elif chose == '5':break
else:
print('\033[31;1m您输入的代号不存在,请重新输入。\033[0m')
pass
student_active
sqlalchemy-orm学生签到 成绩记录查询系统的更多相关文章
- SQLAlchemy ORM之建表与查询
作了最基本的操作,找找感觉.. #coding=utf-8 from datetime import datetime from sqlalchemy import (MetaData, Table, ...
- 暑假闲着没事第一弹:基于Django的长江大学教务处成绩查询系统
本篇文章涉及到的知识点有:Python爬虫,MySQL数据库,html/css/js基础,selenium和phantomjs基础,MVC设计模式,ORM(对象关系映射)框架,django框架(Pyt ...
- C语言 · 成绩查询系统
抱歉,昨天忘了往博客上更新,今天补上. 成绩查询系统 分值: 21 数学老师小y 想写一个成绩查询系统,包含如下指令: insert [name] [score],向系统中插入一条信息,表示名字为na ...
- C语言程序设计#成绩查询系统
学生成绩管理系统 [注释]:请点赞,好人一生平[yi]安[wo]. #codeblocks程序下编写 #include<stdio.h>#include<stdlib.h>// ...
- JavaScript编写学生查询系统
const readline = require('readline-sync')//引用readline-sync //用户名,密码 let user = [{ username: 'yang', ...
- python 之路,Day11 (下)- sqlalchemy ORM
python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...
- sqlalchemy ORM模块使用介绍
前几天用到了flask框架,所以顺带介绍了flask-sqlalchemy扩展模块,去瞄一眼,由于有好多非web的python程序也用到了数据库,所以今天分享一下sqlalchemy的模块的使用方法. ...
- SQLAlchemy ORM教程之二:Query
from:https://www.jianshu.com/p/8d085e2f2657 这是继SQLAlchemy ORM教程之一:Create后的第二篇教程.在上一篇中我们主要是解决了如何配置ORM ...
- Python SQLAlchemy ORM示例
SQLAlchemy的是Python的SQL工具包和对象关系映射,给应用程序开发者提供SQL的强大功能和灵活性. 安装 pip install mysql-python pip install sql ...
随机推荐
- radio两行每行只能选择一个的解决方案!
如图,我要做到这个效果,竖着每行只能有一个最像,和最不像,点击左边禁用右边 <div v-else> <div v-if="progress<quiz.length& ...
- 如何理解Casbin的权限控制
概念: Casbin是什么? Casbin是一个访问控制框架,可以支持多种访问控制模型(如ACL.RBAC.ABAC等) 目的: 我们最终想要实现的效果: 可以控制某一个人/角色(sub)能否对某个资 ...
- js offset系列属性
offsetParent:返回该元素有定位的父级,如果父级都没有定位则返回body offsetTop:返回元素相对父级(带有定位的父级)上方的偏移 offsetLeft:返回元素相对父级(带有定位的 ...
- 【R绘图】当图例映射color/shape等多个属性时,如何修改图例标题?
一般而言,我们修改ggplot2图例标题,常用以下三种方法: + guides(fill=guide_legend(title="New Legend Title")) + lab ...
- mac 下 如何在同一窗口打开多个终端并实现快捷键切换
相信大家编代码的时候都会遇到,每次需要在头文件,库文件和源码文件中编代码的时候,总是需要在几个文件中切换来切换去的,而且一个文件就一个终端窗口,每次都要用鼠标点来点去,非常麻烦,所以如果能把这几个文件 ...
- void * 指针和const 指针
1.void * 是不能进行运算的,例如void *p p++; 这2个值是没有任何规律的. 2 .printf的时候打印void *p 指向的数据,必须强制类型转换,因为编译器不知道取地址多少位. ...
- Spring 注解开发
目录 注解开发简介 常用注解 启用注解功能 bean 定义:@Component.@Controller.@Service.@Repository bean 的引用类型属性注入:@Autowired. ...
- Spark(二十一)【SparkSQL读取Kudu,写入Kafka】
目录 SparkSQL读取Kudu,写出到Kafka 1. pom.xml 依赖 2.将KafkaProducer利用lazy val的方式进行包装, 创建KafkaSink 3.利用广播变量,将Ka ...
- css相关,flex布局全通!
寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平.垂直同时居中. 记得刚开始学习 CSS 的时候,看到 float 属性不由得感觉眼前一亮,顺理成章的联想到 Word 文 ...
- Shell学习(八)——dd命令
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...