赞
踩
经过一段时间学习pymysql的经历,我深刻的体会到了pymysql的不靠谱之处;
就是在使用int型传参,我写的sql语句中格式化%d了之后,我在要传入的数据传递的每一步的去强制转换了,但是他还是会报错,说我的传入参数是string,他要int,我真笑了,最后把%d换成%s结果可以了,,,然后经过我查资料才了解到pymysql他这个库会去自动匹配类型,那也就是说在使用过程中可以对数据类型的关注可以降低一点,让库来给我解决数据类型不匹配的问题。
好了,吐槽就完了,然后就是现在的代码以及内容展示了
1.弹窗过多,看多了会烦
2.界面设置大小不够合理
3.图片元素设置不够合理
4.查询的操作可以使用控件Table展示一个表格,懒的做了
在这里会去获取mysql中数据库db1的表user中的数据,然后会进行判断,成立下一步,不成立,会弹出弹窗,进行警告,成立就进入菜单
然后点击左上角的”点击进行操作吧“下面的按钮是假的哈哈哈哈哈哈哈哈哈。
这里删除之后需要关闭系统,可能是因为我这里有缓存的原因
在这里去查询所有信息就会返回如图弹窗
按学号查询
按姓名查询
按性别查询
按年龄查询
按专业查询
别问我为什么不在这里去做个选择菜单,那就和性别一样了,懒得再进行加工了
按照班级查询
1.pymysql的使用中游标和数据库的未关闭造成的资源浪费,在进行sql语句的执行时,execute执行之后提交事务,然后关闭游标,关闭数据库的连接
2.json文件的多次读取,造成了性能的浪费。使用类属性,然后使用静态方法判断属性是否为空,空则读取json文件内容,非空则继续读取,之后再进行连接。
3.for循环的不当使用,因为数据库的表中字段并不多,所以我去遍历的行为可以,当字段多了就会对性能造成极大浪费,不过字段毕竟就设置了几个。
- from GUI import GUI
-
- if __name__ == '__main__':
- gui = GUI()
- gui.get_in()
- import PySimpleGUI as sg
- from LoginDatabase import LoginDatabase
- from Editor import Editor
- from Find import Find
-
- sg.theme('BlueMono')
-
-
- class GUI(object):
- def __init__(self):
- self.db_login_conn = LoginDatabase()
- self.db_login = self.db_login_conn.login_database_connect_gui()
- self.find = Find()
- self.editor = Editor()
-
- def get_in(self):
- layout = [
- [sg.Image(r'E:\Student_Manager_MySQL\th.png')],
- [sg.T('账号'), sg.InputText(default_text='1', key='first')],
- [sg.T('密码'), sg.InputText(default_text='1', key='second')],
- [sg.B('登录', key='login', button_color='blue'), sg.B('重置', key='rollback', button_color='blue')]
- ]
- window = sg.Window('登录框', layout, text_justification='center')
- while True:
- event, values = window.read()
- if event is None:
- break
- if event == 'login':
- sg.popup_auto_close('进入检测中,请等待')
-
- if values['first'] == self.db_login[0] and values['second'] == self.db_login[1]:
- sg.popup_auto_close("账号密码正确,请做好准备,即将进入系统——3 2 1 ")
- self.menu()
- else:
- sg.popup_auto_close('输入账号或密码错误,你到底是谁,再错我可要报警了奥')
- if event == 'rollback':
- window['first'].update('')
- window['second'].update('')
- window.close()
-
- def menu(self):
- menu_def = [
- ['点击进行操作吧', ['添加学生', '删除学生', '修改学生', '查询学生']]
- ]
- layout = [
- [sg.Image(r'E:\Student_Manager_MySQL\th.png')],
- [sg.T('您好,欢迎您使用本系统,请进行操作', size=(20, 5), font=('宋体', 15))],
- [sg.Menu(menu_def, key='manage_student', size=(20, 20), font=(15, 20))],
- [sg.B('点击进入系统', size=(10, 5), button_color='blue', key='点击进入系统'),
- sg.B('点击退出系统', size=(10, 5), button_color='red', key='点击退出系统')]
- ]
- window = sg.Window('菜单', layout=layout)
- while True:
- event, values = window.read()
- if event in (None, '退出'):
- break
- if event == '添加学生':
- sg.popup_auto_close('你就添加吧,等一会再告诉你怎么写')
- self.add_student_gui()
- if event == '查询学生':
- self.find_student_gui()
- if event == '修改学生':
- self.change_student_gui()
- if event == '删除学生':
- self.delete_student_gui()
- if event == '点击进入系统':
- sg.popup_auto_close('被骗了吧,哈哈哈哈哈', button_color='red')
- if event == '点击退出系统':
- sg.popup_auto_close('这是真的退出了')
- break
- window.close()
-
- # 添加学生信息
- def add_student_gui(self):
- layout = [
- [sg.T("姓名"), sg.In(default_text='请不要设置过长', key='-name-')],
- [sg.T("性别"), sg.OptionMenu(values=['男', '女'], key='-gender-')],
- [sg.T("年龄"), sg.In(default_text='请输入整数(必须输入内容)', key='-age-')],
- [sg.T("专业"), sg.OptionMenu(values=['软件工程', '物联网工程', '大数据', '网络工程'], key='-major-')],
- [sg.T("班级"), sg.Combo(values=['1班', '2班'], key='-classroom-')],
- [sg.B(button_text="添加", key='-add-'), sg.B(button_text="退出", key='-exit-')]
- ]
- window = sg.Window(title='添加学生', layout=layout)
- while True:
- event, values = window.read()
- if event is None:
- break
- if event == '-exit-':
- break
- if event == '-add-':
- # print(int(values['-age-']))
- # print(type(int(values['-age-'])))
- (self.editor.insert_student
- (values['-name-'], values['-gender-'],
- values['-classroom-'], int(values['-age-']), values['-major-']))
- sg.popup_auto_close('添加成功')
- break
- window.close()
-
- # 查询学生信息
- def find_student_gui(self):
- layout = [
- [sg.B('按照学号查询', key='find_id')],
- [sg.B('按照姓名查询', key='find_name')],
- [sg.B('按照性别查询', key='find_gender')],
- [sg.B('按照年龄查询', key='find_age')],
- [sg.B('按照专业查询', key='find_major')],
- [sg.B('按照班级查询', key='find_classroom')],
- [sg.B('查询所有信息', key='find_all')]
- ]
- window = sg.Window('查询学生', layout)
- while True:
- event, values = window.read()
- if event is None:
- break
- if event == 'find_id':
- layout_id = [
- [sg.T('请输入要查询的学生学号id'), sg.In('', key='id')],
- [sg.B('确认', key='id_ok')]
- ]
- window_id = sg.Window('查询学生id', layout_id)
- while True:
- event_id, values_id = window_id.read()
- if event_id is None:
- break
- if event_id == 'id_ok':
- sg.popup(self.find.find_id(int(values_id['id'])))
- window_id.close()
- if event == 'find_name':
- layout_name = [
- [sg.T('请输入要查询的学生姓名name'), sg.In('', key='name')],
- [sg.B('确认', key='name_ok')]
- ]
- window_name = sg.Window('查询学生姓名name', layout_name)
- while True:
- event_name, values_name = window_name.read()
- if event_name is None:
- break
- if event_name == 'name_ok':
- print(values_name['name'])
- sg.popup(self.find.find_name(values_name['name']))
- window_name.close()
- if event == 'find_gender':
- layout_gender = [
- [sg.T('请输入要查询的学生性别gender'), sg.In('', key='gender')],
- [sg.B('确认', key='gender_ok')]
- ]
- window_gender = sg.Window('查询学生性别gender', layout_gender)
- while True:
- event_gender, values_gender = window_gender.read()
- if event_gender is None:
- break
- if event_gender == 'gender_ok':
- print(values_gender['gender'])
- sg.popup(self.find.find_gender(str(values_gender['gender'])))
- window_gender.close()
- if event == 'find_age':
- layout_age = [
- [sg.T('请输入要查询的学生年龄age'), sg.In('', key='age')],
- [sg.B('确认', key='age_ok')]
- ]
- window_age = sg.Window('查询学生年龄age', layout_age)
- while True:
- event_age, values_age = window_age.read()
- if event_age is None:
- break
- if event_age == 'age_ok':
- print(values_age['age'])
- sg.popup(self.find.find_age(int(values_age['age'])))
- window_age.close()
- if event == 'find_major':
- layout_major = [
- [sg.T('请输入要查询的学生专业major'), sg.In('', key='major')],
- [sg.B('确认', key='major_ok')]
- ]
- window_major = sg.Window('查询学生专业major', layout_major)
- while True:
- event_major, values_major = window_major.read()
- if event_major is None:
- break
- if event_major == 'major_ok':
- print(values_major['major'])
- sg.popup(self.find.find_major(str(values_major['major'])))
- window_major.close()
- if event == 'find_classroom':
- layout_classroom = [
- [sg.T('请输入要查询的学生班级classroom'), sg.In('', key='classroom')],
- [sg.B('确认', key='classroom_ok')]
- ]
- window_classroom = sg.Window('查询学生班级classroom', layout_classroom)
- while True:
- event_classroom, values_classroom = window_classroom.read()
- if event_classroom is None:
- break
- if event_classroom == 'classroom_ok':
- sg.popup(self.find.find_classroom(str(values_classroom['classroom'])))
- window_classroom.close()
- if event == 'find_all':
- result = self.find.get_all_students()
- sg.Popup(result)
- window.close()
-
- # 删除学生
- def delete_student_gui(self):
- layout = [
- [sg.T('请输入要删除的学生的学号'), sg.In('', key='id')],
- [sg.B('确认'), sg.B('取消')]
- ]
- window = sg.Window('删除学生', layout)
- while True:
- event, values = window.read()
- if event is None:
- break
- if event == '确认':
- self.editor.delete_student(int(values['id']))
- sg.popup_auto_close('删除成功')
- break
- if event == '取消':
- break
- window.close()
-
- # 修改学生信息
- def change_student_gui(self):
- layout = [
- [sg.T('请输入要修改的学生的学号'), sg.In(key='change_id')],
- [sg.B('确认'), sg.B('取消')]
- ]
- window = sg.Window('修改学生', layout)
- while True:
- event, values = window.read()
- if event is None:
- break
- if event == '确认':
- self.find.find_id(values['change_id'])
- name = self.find.find_id(int(values['change_id']))[0]
- gender = self.find.find_id(values['change_id'])[1]
- classroom = self.find.find_id(values['change_id'])[2]
- age = self.find.find_id(values['change_id'])[3]
- major = self.find.find_id(values['change_id'])[4]
- layout_change = [
- [sg.T('姓名'), sg.In(default_text=name, key='change_name')],
- [sg.T('性别'), sg.In(default_text=gender, key='change_gender')],
- [sg.T('班级'), sg.In(default_text=classroom, key='change_classroom')],
- [sg.T('年龄'), sg.In(default_text=age, key='change_age')],
- [sg.T('专业'), sg.In(default_text=major, key='change_major')],
- [sg.B('修改', key='change_ok')]
- ]
- window_change = sg.Window(title='修改框', layout=layout_change)
- while True:
- event_change, values_change = window_change.read()
- if event_change is None:
- break
- if event_change == 'change_ok':
- self.editor.update_student(student_id=values['change_id'], name=values_change['change_name'],
- gender=values_change['change_gender'],
- classroom=values_change['change_classroom'],
- age=values_change['change_age'], major=values_change['change_major'])
- sg.popup_auto_close('更新成功')
- break
- window_change.close()
- if event == '取消':
- break
- window.close()
- import pymysql
- import json
-
-
- class DatabaseConnect(object):
- def __init__(self):
- # 选择json文件进行存储必需数据
- with open(r'E:\Student_Manager_MySQL\database_login.json', 'r') as f:
- db_config = json.load(f)
- self.host = db_config['host']
- self.port = db_config['port']
- self.username = db_config['username']
- self.password = db_config['password']
- self.database = db_config['database']
- self.charset = db_config['charset']
-
- def connect_database(self):
- try:
- db = pymysql.connect(
- host=self.host,
- port=self.port,
- user=self.username,
- password=self.password,
- database=self.database,
- charset=self.charset
- )
- # print('数据库连接成功')
- # 返回db
- return db
- except pymysql.Error as e:
- print('数据库连接失败' + str(e))
- from DatabaseConnect import DatabaseConnect
-
-
- class LoginDatabase(object):
- def __init__(self):
- # 创建database_connect()类的对象
- self.db_connect = DatabaseConnect()
- # 给self.db赋值为db
- self.db = self.db_connect.connect_database()
-
- def login_database_connect_gui(self):
- # 创建游标对象
- cur = self.db.cursor()
- # 写sql语句
- sqlquery = 'select * from user'
- # 执行SQL语句
- cur.execute(sqlquery)
- # 获取SQL语句的返回值
- results = list(cur.fetchall())
- # print(results)
- result = []
- for i in results:
- for j in i:
- result.append(j)
- # print(result)
- return result
- # print(results)
- #
- #
- # db_connect = database_login()
- # db_connect.login_database_connect_gui()
- from LoginDatabase import LoginDatabase
-
-
- class Editor(LoginDatabase):
- def __init__(self):
- super().__init__()
-
- # 添加学生
- def insert_student(self, name, gender, classroom, age, major):
- # try:
- cur = self.db.cursor()
- values = (name, int(age), major, gender, classroom)
- sql = "INSERT INTO students (name, age, major, gender, classroom) VALUES (%s, %s, %s, %s, %s)"
- cur.execute(sql, values)
- self.db.commit()
- # xiube = '你回去检查一下你输入的年龄'
-
- # except Exception as e:
- # return xiube
-
- # 修改学生
- def update_student(self, student_id, name, age, classroom, gender, major):
- cur = self.db.cursor()
- sql = "UPDATE students SET name = %s, gender = %s, age = %s, major = %s, classroom = %s WHERE id = %s"
- values = (name, gender, age, major, classroom, student_id)
- cur.execute(sql, values)
- self.db.commit()
-
- # 删除学生
- def delete_student(self, student_id):
- cur = self.db.cursor()
- sql = "DELETE FROM students WHERE id = %s"
- cur.execute(sql, (student_id,))
- self.db.commit()
- from LoginDatabase import LoginDatabase
-
-
- # 查询信息
- class Find(LoginDatabase):
- def __init__(self):
- super().__init__()
-
- # 访问所有学生
- def get_all_students(self):
- cur = self.db.cursor()
- cur.execute("SELECT * FROM students")
- results = list(cur.fetchall())
- print(results)
- return results
-
- # 访问id
- def find_id(self, student_id):
- cur = self.db.cursor()
- sql = 'select name,gender,classroom,age,major from students where id=%s ' % student_id
- cur.execute(sql)
- list_1 = []
- result = list(cur.fetchall())
- for i in result:
- for j in i:
- list_1.append(j)
- return list_1
-
- # 访问姓名
- def find_name(self, name):
- cur = self.db.cursor()
- sql = 'select * from students where name like %s'
- cur.execute(sql, (f'%{name}%',))
- result = cur.fetchall()
- return result
-
- # 访问性别
- def find_gender(self, gender):
- cur = self.db.cursor()
- sql = 'select * from students where gender=%s'
- cur.execute(sql, gender)
- result = cur.fetchall()
- return result
-
- # 访问班级
- def find_classroom(self, classroom):
- cur = self.db.cursor()
- sql = 'select * from students where classroom like %s'
- cur.execute(sql, (f"%{classroom}%",))
- result = cur.fetchall()
- return result
-
- # 访问年龄
- def find_age(self, age):
- cur = self.db.cursor()
- sql = 'select * from students where age=%d' % age
- cur.execute(sql)
- result = cur.fetchall()
- return result
-
- # 访问专业
- def find_major(self, major):
- cur = self.db.cursor()
- sql = 'select * from students where major=%s'
- cur.execute(sql, major)
- result = cur.fetchall()
- return result
- {
- "host": "localhost",
- "port": 3306,
- "username": "root",
- "password": "1234",
- "database": "db1",
- "charset": "utf8mb4"
- }
- # 如果要用json那就要把用户名username改成你的用户名,密码和数据库相应也要改成你的
可视化界面中的图片元素的图片是从网络找的,当然末尾也是找的;
好了,就到这里了,这一个版本的系统需求基本实现了,缺少一个用户类,然后细分管理员以及普通用户,但是系统功能都实现了,没关系,版本迭代是迟早的,如果有需要可以私信我要源码,如果之后版本迭代的系统我也写出来了,那当然可以给你了。
如有高见,请指教,如若有所收获,还是感激不尽。
灰太狼的大表哥-CSDN博客感谢灰太郎的大表哥给予我的一些关于pymysql的指导。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。