面向对象学生管理系统(mysql实现)
目的:练习数据库的增删改补查,练习python程序的基础操作。
数据库类:定义类,方便数据的增删改
class MyDB():
def __init__(self, host="127.0.0.1", username="root", password="root", port=3306, database="a"):
'''类例化,处理一些连接操作'''
self.host = host
self.username = username
self.password = password
self.database = database
self.port = port
self.cur = None
self.con = None
# connect to mysql
try:
self.con = pymysql.connect(host=self.host, user=self.username, password=self.password, port=self.port,
database=self.database)
self.cur = self.con.cursor()
print("连接数据成功")
except pymysql.Error as e:
print('数据库连接失败' + str(e))
def close(self):
'''结束查询和关闭连接'''
self.con.close()
def create_table(self, sql_str):
'''创建数据表'''
try:
self.cur.execute(sql_str)
except Exception as e:
print(e)
def query_formatrs(self, sql_str):
'''查询数据,返回一个列表,里面的每一行是一个字典,带字段名
cursor 为连接光标
sql_str为查询语句
'''
try:
self.cur.execute(sql_str)
rows = self.cur.fetchall()
r = []
for x in rows:
r.append(dict(zip(self.cur.column_names, x)))
return r
except:
return False
def query(self, sql_str):
'''查询数据并返回
cursor 为连接光标
sql_str为查询语句
'''
try:
self.cur.execute(sql_str)
rows = self.cur.fetchall()
return rows
except:
return False
def execute_update_insert(self, sql):
'''
插入或更新记录 成功返回最后的id
'''
self.cur.execute(sql)
self.con.commit()
return self.cur.lastrowid
项目主界面
class StudentManager(object):
def __init__(self):
# 存储学员数据 -- 列表
self.student_list = []
# 一. 程序入口函数
def run(self):
# 1. 加载文件里面的学员数据
'''需要进行修改,换为获取数据库中的数据'''
self.load_student()
while True:
# 2. 显示功能菜单
self.show_menu()
# 3. 用户输入目标功能序号
menu_num = int(input('请输入您需要的功能序号:'))
# 4. 根据用户输入的序号执行不同的功能 -- 如果用户输入1,执行添加
if menu_num == 1:
# 添加学员
self.add_student()
elif menu_num == 2:
# 删除学员
self.del_student()
elif menu_num == 3:
# 修改学员信息
self.modify_student()
elif menu_num == 4:
# 查询学员信息
self.search_student()
elif menu_num == 5:
# 显示所有学员信息
self.show_student()
elif menu_num == 6:
# 保存学员信息
self.save_student()
elif menu_num == 7:
# 退出系统 -- 退出循环
break
# 二. 系统功能函数
# 2.1 显示功能菜单 -- 打印序号的功能对应关系 -- 静态
@staticmethod
def show_menu():
print('请选择如下功能:')
print('1:添加学员')
print('2:删除学员')
print('3:修改学员信息')
print('4:查询学员信息')
print('5:显示所有学员信息')
print('6:显示当前时间')
print('7:退出系统')
添加学员操作
# 2.2 添加学员
def add_student(self):
# 1. 用户输入姓名、性别、手机号
name = input('请输入您的姓名:')
gender = input('请输入您的性别:')
tel = input('请输入您的手机号:')
mydb = MyDB() # 创建操作对象,初始化操作
#进行数据添加操作
# mydb.execute_update_insert('insert into people (name,gender,tel) values(%s,%s,%s)'% \
# (name,gender,tel))
# sql = "select * from t_student where sname=%s and passwd=%s"
sql = 'insert into people (name,gender,tel) values(%s,%s,%s)'
params = (name,gender,tel)
mydb.cur.execute(sql, params)
mydb.con.commit()
mydb.cur.close()
mydb.con.close()
# 2. 创建学员对象 -- 类 ?类在student文件里面 先导入student模块,再创建对象
student = Student(name, gender, tel)
# 3. 将该对象添加到学员列表
self.student_list.append(student)
"""直接进行数据库的存储好像也可以哦"""
print(self.student_list)
print(student)
删除学员操作
# 2.3 删除学员
def del_student(self):
# 1. 用户输入目标学员姓名
del_name = input('请输入要删除的学员姓名:')
mydb = MyDB() # 创建操作对象,初始化操作
# 进行数据添加操作
try:
sql = "delete from people where name=%s"
params = (del_name)
# sql = ('delete from test where name={}'.format(del_name))
mydb.cur.execute(sql,params)
mydb.con.commit()
mydb.cur.close()
mydb.con.close()
except pymysql.Error as e:
print("此人不存在:" + str(e))
# 2. 遍历学员列表,如果用户输入的学员存在则删除学员对象,否则提示学员不存在
for i in self.student_list:
if del_name == i.name:
# 删除该学员对象
self.student_list.remove(i)
break
else:
# 循环正常价结束执行的代码:循环结束都没有删除任何一个对象,所以说明用户输入的目标学员不存在
print('查无此人!')
print(self.student_list)
修改学员操作
# 2.4 修改学员信息,对于数据库来说,前提是先进行查找,确认此人是否存在
def modify_student(self):
# 1. 用户输入目标学员姓名
modify_name = input('请输入要修改的学员姓名:')
mydb = MyDB() # 创建操作对象,初始化操作
sql = "select * from people where name=%s"
params = (modify_name)
print(sql)
# 执行sql语句,返回查询到的记录条数rowcount,如果是rowcount不为0,则登录成功,否则登录失败
rowcount = mydb.cur.execute(sql, params)
if rowcount != 0:
sql = "delete from people where name=%s"
params1 = (modify_name)
# sql = ('delete from test where name={}'.format(del_name))
mydb.cur.execute(sql, params1)
print('查有此人,请重新输入用户信息')
name = input('姓名:')
gender = input('性别:')
tel = input('手机号:')
print(f'修改学员信息成功,姓名{name}, 性别{gender}, 手机号{tel}')
mydb.execute_update_insert('insert into people (name,gender,tel) values(%s,%s,%s)' % \
(name, gender, tel))
# sql = "update people set name=%s and gender=%s and tel = %s WHERE name = %s"
mydb.cur.execute(sql, params1)
mydb.con.commit()
mydb.cur.close()
mydb.con.close()
else:
print('查无此人')
# 2. 遍历列表数据,如果学员存在修改姓名性别手机号,否则提示学员不存在
for i in self.student_list:
if modify_name == i.name:
i.name = input('姓名:')
i.gender = input('性别:')
i.tel = input('手机号:')
print(f'修改学员信息成功,姓名{i.name}, 性别{i.gender}, 手机号{i.tel}')
break
else:
print('查无此人!')
查询操作
# 2.5 查询学员信息
def search_student(self):
# 1. 用户输入目标学员姓名
search_name = input('请输入您要搜索的学员姓名:')
mydb = MyDB() # 创建操作对象,初始化操作
sql = "select * from people where name=%s"
params = (search_name)
print(sql)
# 执行sql语句,返回查询到的记录条数rowcount,如果是rowcount不为0,则登录成功,否则登录失败
rowcount = mydb.cur.execute(sql, params)
if rowcount != 0:
print('查有此人,具体信息如下:')
try:
mydb.cur.execute(sql, params)
results = mydb.cur.fetchall()
for row in results:
name = row[0]
gender = row[1]
tel = row[2]
print(f'姓名是{name}, 性别是{gender}, 手机号是{tel}')
except pymysql.Error as e:
print("数据查询失败:" + str(e))
else:
print('查无此人')
显示所有学员信息操作
# 2.6 显示所有学员信息
def show_student(self):
# 1. 打印表头
print('姓名\t性别\t手机号')
# 2. 打印学员数据
mydb_new = MyDB()
results = mydb_new.query("SELECT * FROM people")
print(results)
for row in results:
name = row[0]
gender = row[1]
tel = row[1]
print(f'{name}\t{gender}\t{tel}')
for i in self.student_list:
print(f'{i.name}\t{i.gender}\t{i.tel}')
定时器+保存操作:将数据保存到文件,且运用定时器进行时间的定时输出操作,运用多线程,不影响程序进行。
def run1():
now_time = datetime.datetime.now() # 获取当前时间
print("十秒钟我将为您输出一次当前时间:"+now_time)
timer_2 = threading.Timer(10,run1) # 进行递归调用
timer_2.start()
# 2.7 定时器+保存操作
def save_student(self):
#定时器
# 1. 打开文件
f = open('student.data', 'w')
# 2. 文件写入数据
# 2.1 [学员对象] 转换成 [字典]
new_list = [i.__dict__ for i in self.student_list]
# 2.2 文件写入 字符串数据
f.write(str(new_list))
# 3. 关闭文件
f.close()
timer_1 = threading.Timer(10, run1) # 定时器1秒钟调用run方法
timer_1.start()
文件数据的加载操作
# 2.8 加载学员信息
def load_student(self):
# 1. 打开文件:尝试r打开,如果有异常w
try:
f = open('student.data', 'r')
except:
f = open('student.data', 'w')
else:
# 2. 读取数据:文件读取出的数据是字符串还原列表类型;[{}] 转换 [学员对象]
data = f.read() # 字符串
new_list = eval(data)
for i in new_list:
self.student_list = [Student(i['name'], i['gender'], i['tel'])]
# self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list]
finally:
# 3. 关闭文件
f.close()