-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMySQLite3Util.py
282 lines (241 loc) · 6.85 KB
/
MySQLite3Util.py
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
from Models import *
# 用来初始化数据库连接,创建数据库引擎,echo为True,会打印所有的sql语句,方便调试
engine = create_engine('sqlite:///./Stu.db', echo=False)
# 创建DBSession会话类
DBSession = sessionmaker(bind=engine)
Base_ref = automap_base()
Base_ref.prepare(engine, reflect=True)
def create_db_table():
"""
创建数据表
:return:
"""
db_conn = engine.connect()
db_conn.execute(r'''CREATE TABLE Assignments (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
AssName TEXT NOT NULL,
MaxCount INTEGER,
CurrentCount INTEGER
);
''')
db_conn.execute(r'''CREATE TABLE Majors (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
MajorName TEXT NOT NULL
);''')
db_conn.execute(r'''CREATE TABLE Teams (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
TeamName TEXT NOT NULL,
TeamScore INTEGER,
VoteNum INTEGER,
AssID INTEGER REFERENCES Assignments (ID) ON DELETE CASCADE
);''')
db_conn.execute(r'''CREATE TABLE Students (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
StuName TEXT NOT NULL,
StuSex TEXT,
StuNum TEXT NOT NULL,
MajorID INTEGER REFERENCES Majors (ID) ON DELETE CASCADE,
TeamID INTEGER REFERENCES Teams (ID) ON DELETE CASCADE
);
''')
db_conn.close()
def delete_all_table():
"""
一次性删除全部表
:return:
"""
Base.metadata.drop_all(engine)
def get_ref_table():
"""
返回通过sqlalchemy的反射机制获取的数据库表结构
:return:
"""
# 使用反射,加载数据库的表,具体需要访问数据库的哪一张表只需要‘table.表名’即可
table = Base_ref.classes
return table
def get_session():
"""
获取session对象
:return:
"""
return DBSession()
def add_one_msg(model):
"""
为数据库添加一条记录
:param model: 实例对象
:return:
"""
# 获取session对象:
session = get_session()
session.add(model)
# 提交即保存到数据库:
session.commit()
# 关闭session:
result_id = model.ID
session.close()
return result_id
def add_some_msg(model):
"""
一次性添加若干条记录
:param model:
:return:
"""
pass
def query_all(model):
"""
传入要查询的表名,返回表的所有数据
:param model: 表名
:return:
"""
session = get_session()
lists = session.query(model).all()
# print(lists)
session.close()
return lists
def query_all_for_tree():
"""
为构建树状图专门服务的方法
一次查询所有的课设题目,小组,学生,
:return:
"""
session = get_session()
assig_lists = session.query(Assignments).all()
assig_dir = dict()
for assig_list in assig_lists:
team_lists = []
for team_list in assig_list.teams:
team_dir = {}
stu_lists = []
for stu_list in team_list.students:
stu_lists.append(stu_list.StuName)
team_dir[team_list.TeamName] = stu_lists
team_lists.append(team_dir)
assig_dir[assig_list.AssName] = team_lists
session.close()
return assig_dir
def query_some_by_condition(model, column, condition):
"""
传入表对应的实体类的类名,列名和条件,返回符合的记录
:param model:表对应的实体类的类名
:param column:列名
:param condition:条件
:return: list
"""
model_name = model.__name__
sql_str = 'select * from {} WHERE {} = "{}"'.format(model_name, column, condition)
session = get_session()
result = session.execute(sql_str).fetchall()
session.close()
return result
def query_one_by_condition(model, column, condition):
"""
传入表对应的实体类的类名,列名和条件,返回符合的第一条记录
:param model:表对应的实体类的类名
:param column:列名
:param condition:条件
:return:
"""
return query_some_by_condition(model, column, condition)[0]
def update_team_vote(team_id, vote):
"""
为指定ID的小组投票
:param team_id:
:param vote:
:return:
"""
session = get_session()
session.query(Teams).filter(Teams.ID == team_id).update(
{Teams.VoteNum: vote})
session.commit()
session.close()
def update_team_score(team_id, score):
"""
为指定ID的小组修改成绩
:param team_id:
:param score:
:return:
"""
session = get_session()
session.query(Teams).filter(Teams.ID == team_id).update(
{Teams.TeamScore: score})
session.commit()
session.close()
def update_AssiCurrentCount(new_current_count, assi_name):
"""
根据条件更新指定表的指定列
:param new_current_count:
:param assi_name:
:return:
"""
session = get_session()
session.query(Assignments).filter(Assignments.AssName == assi_name).update(
{Assignments.CurrentCount: new_current_count})
session.commit()
session.close()
def add_get_generated_key(model):
"""
新增一条记录并返回主键
:param model:
:return:
"""
# 获取session对象:
session = get_session()
session.add(model)
# 提交即保存到数据库:
session.commit()
session.flush()
# 关闭session:
session.close()
return model.ID
def get_first_data(index, value):
result, session = get_data(index, value)
if len(result):
return result[0], session
else:
result = None
return result, session
def get_data(index, name):
"""
根据树状图双击的获得属性,去数据库找相关详细信息
:param index:
:param name:
:return:
"""
session = get_session()
if index == 0:
# 查询 题目信息
result = session.query(Assignments).filter(Assignments.AssName == name).all()
elif index == 1:
# 查询小组信息
result = session.query(Teams).filter(Teams.TeamName == name).all()
elif index == 2:
# 查询学生讯息
result = session.query(Students).filter(Students.StuName == name).all()
elif index == 3:
# 查询专业信息
result = session.query(Majors).filter(Majors.MajorName == name).all()
return result, session
def delete_by_id(model, value):
"""
根据条件删除记录
:param model:
:param value:
:return:
"""
session = get_session()
session.delete(session.query(model).filter_by(ID=value).first())
session.commit()
session.close()
pass
def lazy_close(session, flag=True):
if flag:
session.close()
else:
print('会话未关闭')