开始之前首先讲一下遇到最大的两个坑.

  • 在系统初始化之前,先从MySQL数据库中拉取数据,这里使用cursor.fetchall读取到所有的数据是元组套元组的形式.然后我用for遍历,在for循环外面定义了个字典,将遍历到的每个元组转换为字典的value值.然后坑爹的来了,由于字典我放在了for循环外面定义, 导致字典只有一个地址,每次读取到数据存入字典中,然后append到list,始终是元组的最后一组值.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
stu_dict = {}  # 这里字典位置应该放到for循环里面的嗷
data = cursor.fetchall()
# 将从数据库中获取的数据写入到列表中
for i in data:
# 这个字典,我开始放在了for循环上面,但实际上是错误的
"""
局部变量和全局变量的区别,for循环中定义,定义三次,每次的地址都不一样
如果放在外边,只有一个地址,内容发生变化,之前存储的内容也会变(尝试解释一通
"""
stu_dict['sid'] = i[0]
stu_dict['name'] = i[1]
stu_dict['age'] = i[2]
stu_dict['tel'] = i[3]
stu_list.append(stu_dict)
  • 正确的做法是将字典定义放到for循环里面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
data = cursor.fetchall()
# 将从数据库中获取的数据写入到列表中
for i in data:
# 这个字典,我开始放在了for循环上面,但实际上是错误的
"""
局部变量和全局变量的区别,for循环中定义,定义三次,每次的地址都不一样
如果放在外边,只有一个地址,内容发生变化,之前存储的内容也会变(尝试解释一通
"""
stu_dict = {}
stu_dict['sid'] = i[0]
stu_dict['name'] = i[1]
stu_dict['age'] = i[2]
stu_dict['tel'] = i[3]
stu_list.append(stu_dict)

第二个坑

写入数据但是没有调用cursor的提交

1
2
3
4
# 向数据库中写入数据
cursor.execute(f"insert into test.stu values ('{sid}','{name}',{age},'{tel}');")
# 向数据库中提交数据
conn.commit()

学生管理系统(数据库版)

不得不说,之前大学写的Java宿舍管理系统,那代码是真的多,还是Python简单啊!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# 手敲学生管理系统
import pymysql

# 和mysql建立连接
conn = pymysql.connect(
# h p u p d c
host='127.0.0.1',
port=3306,
user='root',
password='123456',
database='test',
charset='utf8'
)

# 创建游标
cursor = conn.cursor()

# 这里如果写字典就会导致插入时会覆盖多条数据(不知道问什么
stu_list = []


# 定义打印菜单的方法
def menu():
print("=" * 10,end='')
print(" 学生管理系统 ",end='')
print("=" * 10)
print("\t\t 1,添加学生信息")
print("\t\t 2,修改学生信息")
print("\t\t 3,删除学生信息")
print("\t\t 4,所有学生信息")
print("\t\t 5,查询学生信息")
print("\t\t 6,退出学生系统")
print("=" * 34)


# 定义添加学生信息的方法
def add_stu():
global stu_list
stu_dict = {}
# 定义列表用于存储学生的信息
# 判断学生是否存在
sid = int(input("请输入添加学生的学号:"))
for i in stu_list:
if i['sid'] == sid:
# 说明该学生已经存在
print("该学生已经存在!")
break
else:
# 只有循环正常结束才会执行
name = input("请输入添加学生的姓名:")
age = input("请输入添加学生的年龄:")
tel = input("请输入添加学生的电话:")
# 将用户输入的内容添加到字典中
stu_dict['sid'] = sid
stu_dict['name'] = name
stu_dict['age'] = age
stu_dict['tel'] = tel
# 将字典中的值添加到列表中
stu_list.append(stu_dict)
print(stu_list)


# 修改学生信息
def modify_stu():
global stu_list
sid = int(input("请输入您要修改学生的学号:"))
# 判断该学生信息是否存在
for i in stu_list:
if i['sid'] == sid:
new_sid = int(input("请输入新的学生学号:"))
i['sid'] = new_sid
new_name = input("请输入新的学生姓名:")
i['name'] = new_name
new_age = input("请输入新的学生年龄:")
i['age'] = new_age
new_tel = input("请输入新的学生电话:")
i['tel'] = new_tel
print("修改成功!")
# cursor.execute('update stu set sid="new_sid" where sid=i["sid"]')
break
else:
# for else 只有在循环正常结束后才会执行
print("抱歉,没有这个学生!")


# 删除学生的信息
def del_stu():
sid = int(input("请输入要删除学生的学号:"))
count = 0
# 判断学生的信息是否存在
for i in stu_list:
if i['sid'] == sid:
# 执行删除(del是按照元素下标进行删除的,remove是按照元素值进行删除的
del stu_list[count]
print("删除成功!")
break
count += 1
else:
# 当循环正常结束时执行else中的语句
print("没有这个学生!")


# 所有学生的信息
def show_all():
print("学号\t姓名\t年龄\t电话\t")
for i in stu_list:
print(f"{i['sid']}\t\t{i['name']}\t{i['age']}\t{i['tel']}\t")

# 查询学生信息
def search_stu():
sid = int(input("请输入要查询学生的学号: "))
for i in stu_list:
if i.get("sid") == sid:
print("学号\t姓名\t年龄\t电话\t")
print(f"{i['sid']}\t\t{i['name']}\t{i['age']}\t{i['tel']}\t")
break
else:
print("没有查询到该学生的信息!")


# 创建判断用户录入的函数
def func():
# 打印菜单
menu()
while True:
# 使用强制类型转换,将输入的值转换为int
choice = int(input("请输入您要进行的操作:"))
# 判断用户的输入
if choice == 1:
add_stu()
elif choice == 2:
modify_stu()
elif choice == 3:
del_stu()
elif choice == 4:
show_all()
elif choice == 5:
search_stu()
elif choice == 6:
break
else:
print("没有这种操作,请您重新录入!")
continue


# 读取数据函数
def read():
global stu_list
# 定义空字典
cursor.execute('select sid,name,age,tel from test.stu;')
data = cursor.fetchall()
# 将从数据库中获取的数据写入到列表中
for i in data:
# 这个字典,我开始放在了for循环上面,但实际上是错误的
"""
局部变量和全局变量的区别,for循环中定义,定义三次,每次的地址都不一样
如果放在外边,只有一个地址,内容发生变化,之前存储的内容也会变(尝试解释一通
"""
stu_dict = {}
stu_dict['sid'] = i[0]
stu_dict['name'] = i[1]
stu_dict['age'] = i[2]
stu_dict['tel'] = i[3]
stu_list.append(stu_dict)
print(type(stu_list))
print(stu_list)


# 写入数据函数
def write():
global stu_list
# 将列表中的数据写入到数据库中(首先清空数据库
cursor.execute("truncate table test.stu;")
# 提交删除操作
conn.commit()
for i in stu_list:
print(i)
# i是字典,字典的values为值 i["sid"],i["name"],i["age"],i["tel"]
sid = i["sid"]
name = i["name"]
age = i["age"]
tel = i["tel"]
cursor.execute(f"insert into test.stu values ('{sid}','{name}',{age},'{tel}');")
conn.commit()
cursor.close()


if __name__ == '__main__':
# 调用函数读取数据
read()
# 调用系统func函数
func()
# 调用写函数
write()

学生管理系统(文件版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# 这里如果写字典就会导致插入时会覆盖多条数据(不知道问什么
stu_list = []

# 定义打印菜单的方法
def menu():
print("=" * 10,end='')
print(" 学生管理系统 ",end='')
print("=" * 10)
print("\t\t 1,添加学生信息")
print("\t\t 2,修改学生信息")
print("\t\t 3,删除学生信息")
print("\t\t 4,所有学生信息")
print("\t\t 5,查询学生信息")
print("\t\t 6,退出学生系统")
print("=" * 34)


# 定义添加学生信息的方法
def add_stu():
global stu_list
stu_dict = {}
# 定义列表用于存储学生的信息
# 判断学生是否存在
sid = int(input("请输入添加学生的学号:"))
for i in stu_list:
if i['sid'] == sid:
# 说明该学生已经存在
print("该学生已经存在!")
break
else:
# 只有循环正常结束才会执行
name = input("请输入添加学生的姓名:")
age = input("请输入添加学生的年龄:")
tel = input("请输入添加学生的电话:")
# 将用户输入的内容添加到字典中
stu_dict['sid'] = sid
stu_dict['name'] = name
stu_dict['age'] = age
stu_dict['tel'] = tel
# 将字典中的值添加到列表中
stu_list.append(stu_dict)
print(stu_list)


# 修改学生信息
def modify_stu():
global stu_list
sid = int(input("请输入您要修改学生的学号:"))
# 判断该学生信息是否存在
for i in stu_list:
if i['sid'] == sid:
new_sid = int(input("请输入新的学生学号:"))
i['sid'] = new_sid
new_name = input("请输入新的学生姓名:")
i['name'] = new_name
new_age = input("请输入新的学生年龄:")
i['age'] = new_age
new_tel = input("请输入新的学生电话:")
i['tel'] = new_tel
print("修改成功!")
# cursor.execute('update stu set sid="new_sid" where sid=i["sid"]')
break
else:
# for else 只有在循环正常结束后才会执行
print("抱歉,没有这个学生!")


# 删除学生的信息
def del_stu():
sid = int(input("请输入要删除学生的学号:"))
count = 0
# 判断学生的信息是否存在
for i in stu_list:
if i['sid'] == sid:
# 执行删除(del是按照元素下标进行删除的,remove是按照元素值进行删除的
del stu_list[count]
print("删除成功!")
break
count += 1
else:
# 当循环正常结束时执行else中的语句
print("没有这个学生!")

# 所有学生的信息
def show_all():
print("学号\t姓名\t年龄\t电话\t")
for i in stu_list:
print(f"{i['sid']}\t\t{i['name']}\t{i['age']}\t{i['tel']}\t")

# 查询学生信息
def search_stu():
sid = int(input("请输入要查询学生的学号: "))
for i in stu_list:
if i.get("sid") == sid:
print("学号\t姓名\t年龄\t电话\t")
print(f"{i['sid']}\t\t{i['name']}\t{i['age']}\t{i['tel']}\t")
break
else:
print("没有查询到该学生的信息!")


# 创建判断用户录入的函数
def func():
# 打印菜单
menu()
while True:
# 使用强制类型转换,将输入的值转换为int
choice = int(input("请输入您要进行的操作:"))
# 判断用户的输入
if choice == 1:
add_stu()
elif choice == 2:
modify_stu()
elif choice == 3:
del_stu()
elif choice == 4:
show_all()
elif choice == 5:
search_stu()
elif choice == 6:
break
else:
print("没有这种操作,请您重新录入!")
continue


# 读取数据函数
def read():
global stu_list
with open("student.txt", "r", encoding="utf8") as f:
data = f.readlines() # str类型 1,小威,23,17627763251
for i in data: # <class 'list'>: ['1,小威,23,17627763251\n', '2,小华,23,17627763251']
stu_dict = {}
# i为字符串1,小威,23,17627763251\n
stu_dict["sid"] = i.split(",")[0]
stu_dict["name"] = i.split(",")[1]
stu_dict["age"] = i.split(",")[2]
stu_dict["tel"] = i.split(",")[3][0:-1]
stu_list.append(stu_dict)
f.close()


# 写入数据函数
def write():
global stu_list
# stu_list 是列表套字典
with open("student.txt", "w", encoding="utf8") as f:
for i in stu_list:
f.write(f'{i["sid"]},{i["name"]},{i["age"]},{i["tel"]}\n')


if __name__ == '__main__':
# 调用函数读取数据
read()
# 调用系统func函数
func()
# 调用写函数
write()