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 ...
随机推荐
- Swift-技巧(九)CGImage To CVPixelBuffer
摘要 iOS 中图像的表现形式不只是 Image,还有更加底层的方式,比如 CVPixelBuffer 像素缓存形式,那么 CGImage 就可以转换为像素缓存的方式也是需要了解的. CGImage ...
- Codeforces 718E - Matvey's Birthday(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 首先注意到这个图的特殊性:我们对于所有 \(s_i=s_j\) 的 \((i,j)\) 之间都连了条边,而字符集大小顶多只有 \(8\ ...
- 洛谷 P7156 - [USACO20DEC] Cowmistry P(分类讨论+trie 树上 dp)
题面传送门 题意: 给出集合 \(S=[l_1,r_1]\cup[l_2,r_2]\cup[l_3,r_3]\cup\dots\cup[l_n,r_n]\) 和整数 \(k\),求有多少个三元组 \( ...
- 【机器学习与R语言】13- 如何提高模型的性能?
目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...
- Go 类型强制转换
Go 类型强制转换 强制类型的语法格式:var a T = (T)(b),使用括号将类型和要转换的变量或表达式的值括起来 强制转换需要满足如下任一条件:(x是非常量类型的变量,T是要转换的类型) 1. ...
- 53-Linked List Cycle II
Linked List Cycle II My Submissions QuestionEditorial Solution Total Accepted: 74093 Total Submissio ...
- 修改Ubuntu中locale转中文为英文
修改Ubuntu 的命令行为英文版 编辑 /etc/default/locale 文件 原来的配置为: LANG="zh_CN.UTF-8″ LANGUAGE="zh_CN:&q ...
- 5分钟6步强制删除kubernetes NameSpace小技巧
在使用kubernetes过程中,我们经常会遇到无法删除NameSpace的情况,但是如果一一去删除NameSpace中资源比较麻烦.下面我们给大家介绍强制删除NameSpace的方法. 一.查看已存 ...
- CSS3实现字体描边
CSS3实现字体描边的两种方法 -webkit-text-stroke: 1px #fff;:不建议,向内描边,字体颜色变细,效果不佳: 用box-shadow模拟描边,向外描边,保留字体粗细,赞! ...
- 12 — springboot集成JPA — 更新完毕
1.什么是jpa? 一堆不想整在这博客里面的理论知识.这些理论玩意儿就应该自行领悟到自己脑海里 1).JPA & Spring Data JPA 1.1).JPA JPA是Java Persi ...