使用面向对象的方法对不同的操作行为进行定义不同的类,从而实现对学生信息的查询,新增,修改和删除。
每次操作之后会返回进行下次操作的选择。
main.py #程序执行入口
from week2.Class.student.front.frontstu import frontstu
#引入自定义模块
from week2.Class.student.db.dboption import dboption
from week2.Class.student.back.backstu import backstu
if __name__ == '__main__':
backObj=backstu() #建立backstu类的对象
frontObj=frontstu() #建立frontstu类的对象
while True:
option = input('请输入您要进行的选择1.search 2.add 3.update 4.delete:')
if option.isdigit() and len(option) == 1:
if option == '1': # 查询
frontObj.getStuSearchInfo()
#通过frontObj对象访问frontstu类的对象方法getStuSearchInfo()
elif option == '2': # 新增
frontObj.getStuAddInfo()
#通过frontObj对象访问frontstu类的对象方法getStuAddInfo()
elif option == '3': # 修改
frontObj.getStuUpdateInfo()
elif option == '4': # 删除
frontObj.getStuDeleteInfo()
else:
print('非法输入!请重新输入')
dboption.closeDB(backObj.dbObj,backObj.curObj)
#关闭数据库连接
frontstu.py #接收信息并将数据返回给backstu,并将从backstu中得到的数据打印出来
from week2.Class.student.back.backstu import backstu
class frontstu:
def __init__(self): #初始化方法
self.backObj = backstu() #建立对象
def getStuSearchInfo(self):
try: #捕捉异常
name, cid, sex, race = input('请输入您要查询的信息(每个信息请以逗号分隔)\n姓名、班级、性别、民族:').split(',')
#接收信息
stutuple = self.backObj.searchStu(name, cid, sex, race)
#访问backstu中的searchStu()方法,通过searchStu()方法查询数据库中符合条件的信息,并将得到的信息存储在stutupe元组中
if len(stutuple) > 0:
#如果元组长度大于0说明查询得到符合条件的信息,否则说明数据库中没有符合该条件的信息
for i in range(0, len(stutuple)): #将得到的信息进行遍历,并打印出来
print(
f"学号:{stutuple[i][0]:<7} 姓名:{stutuple[i][1]:<12} 出生日期:{stutuple[i][2]} 入学日期:{stutuple[i][3]} \n性别:{stutuple[i][5]:<7} 班级:{stutuple[i][7]:<14}")
print('民族:', stutuple[i][4], '\t', '身高:', stutuple[i][6], '\t', '爱好:', stutuple[i][8], '备注:',
stutuple[i][9], '\n')
else:
print('您输入的信息不存在,未找到符合条件的记录!')
except:
print('您输入的信息有误!\n请检查输入的信息是否为四个数据、数据之间是否用中文逗号隔开')
def getStuAddInfo(self):
try: #捕捉异常
name, birth, firstday, sex, cid = input('请输入必填信息(每个信息使用中文逗号分割开)\n姓名、出生日期、入学日期、性别、班级:').split(',')
race, height, hobbies, remarks = input('请输入选填信息(每个信息使用中文逗号分隔开)\n民族、身高、爱好、备注:').split(',')
if name != '' and birth != '' and firstday != '' and sex != '' and cid != '':
#必填信息不为空则进行下一步操作,否则提示必填信息不能为空
if height == '':
height = 0
if sex == '男' or sex == '女':
result = self.backObj.addStu(name, birth, firstday,sex, cid,race, height, hobbies, remarks)
#访问backstu中的addStu()方法
if result == 0:
print('新增信息成功!')
elif result == -1:
print('新增信息失败!')
else:
print('性别输入错误,请选填“男”或“女”')
else:
print('必填信息不可为空!')
except:
print('信息输入不符合规范!请输入符合规范的四个数据并使用中文逗号分隔数据!')
def getStuUpdateInfo(self):
name = input('请输入您的姓名:')
if name != '':
searchResult = self.backObj.searchStu(name)
#访问backstu中的searchStu()方法,先查询输入的姓名是否存在于数据库中
if len(searchResult) > 0: #大于0说明存在于数据库中
try: #捕捉异常
birth, firstday, sex, cid = input('请输入您要修改必填的信息\n出生日期,入学日期,性别,班级,:').split(',')
if searchResult[0][4] == '':
race = ''
print('民族信息不可更改')
else:
race = input('请输入选填信息民族:')
if searchResult[0][6] == 0:
height = 0
print('身高信息不可更改')
else:
height = input('请输入选填信息身高:')
if searchResult[0][8] == '':
hobbies = ''
print('爱好信息不可更改')
else:
hobbies = input('请输入选填信息爱好:')
if searchResult[0][9] == '':
remarks = ''
print('备注信息不可更改')
else:
remarks = input('请输入选填信息备注:')
if name != '' and birth != '' and firstday != '' and sex != '' and cid != '':
cid = int(cid)
result = self.backObj.updateStu(name=name, birth=birth, firstday=firstday, sex=sex, CID=cid, race=race,height=height, hobbies=hobbies, remarks=remarks)
#访问backstu中的updateStu()方法
if result == 0:
print('信息修改成功!')
elif result == -1:
print('信息修改失败')
except:
print('您输入的信息不符合规范!\n请检查输入的信息是否为四个数据、数据之间是否用中文逗号隔开')
else:
print('您输入的姓名不存在,未找到符合条件的记录!')
else:
print('姓名不可为空,请重新输入')
# if len(result) > 0:
pass
def getStuDeleteInfo(self):
name = input('请输入您要删除的学生姓名:')
if name != '':
searchResult = self.backObj.searchStu(name)
if len(searchResult) > 0:
result = self.backObj.deletStu(name)
if result == 0:
print('删除信息成功!')
elif result == -1:
print('删除信息失败')
else:
print('您输入的姓名不存在,未找到符合条件的记录!')
else:
print('姓名不能为空,请重新输入!')
backstu.py #对数据库中的信息进行调用,包括读取,新增,修改,删除
from week2.Class.student.db.dboption import dboption
from week2.Class.student.config.dbdata import dbdata
class backstu:
def __init__(self): #初始化方法
self.dbObj,self.curObj=dboption.openDB(host=dbdata.host, user=dbdata.user, passwd=dbdata.passwd, port=dbdata.Port, db=dbdata.db)
#连接数据库
def searchStu(self, name='', cid='', sex='', race=''):
sql = 'select * from student where '
if name == '':
sql = sql + 'sname=sname'
else:
sql = sql + f"sname='{name}'"
if cid == '':
sql = sql + ' and cid=cid'
else:
sql = sql + f" and cid={cid} "
if sex == '':
sql = sql + ' and sex=sex'
else:
sql = sql + f" and sex='{sex} '"
if race == '':
sql = sql + ' and race=race'
else:
sql = sql + f" and race='{race}'"
#根据条件拼写查询的sql语句
#print(sql)
return dboption.readDB(self.curObj, sql)
#将sql语句返回给数据库读操作
def addStu(self,Sname, birth, firstday, sex, CID, race='', height=0, hobbies='', remarks=''):
sql = f"insert into student(Sname,birth,firstday,sex,CID,race,height,hobbies,remarks) values('{Sname}','{birth}','{firstday}','{sex}',{CID},'{race}','{height}','{hobbies}','{remarks}')"
#根据条件拼写新增数据的sql语句
#print(sql)
return dboption.writeDB(self.dbObj, self.curObj, sql)
#将sql语句返回给数据库写操作
def updateStu(self,name, birth, firstday, sex, CID, race='', height=0, hobbies='', remarks=''):
sql = f"update student set birth='{birth}',firstDay='{firstday}',sex='{sex}',CID={CID} "
if race != '':
sql = sql + f", race='{race}' "
else:
sql = sql
if height != 0 or height != '':
sql = sql + f", height={height} "
else:
sql = sql
if hobbies != '':
sql = sql + f", hobbies='{hobbies}' "
else:
sql = sql
if remarks != '':
sql = sql + f", remarks='{remarks}' "
else:
sql = sql
sql = sql + f" where Sname='{name}'"
#根据条件拼写修改的sql语句
#print(sql)
return dboption.writeDB(self.dbObj, self.curObj, sql)
#将sql语句返回给数据库写操作
def deletStu(self,name):
sql = f"delete from student where Sname='{name}'"
#根据条件拼写删除的sql语句
#print(sql)
return dboption.writeDB(self.dbObj, self.curObj, sql)
#将sql语句返回非数据库写操作
dboption.py #数据库的打开操作、读写操作、关闭操作方法
class dboption:
@staticmethod #静态方法
def openDB(host, user, passwd, db, port):
import pymysql
dbObj = pymysql.connect(host=host, user=user, password=passwd, db=db, port=port, charset='utf8')
cueObj = dbObj.cursor() #连接数据库
return dbObj, cueObj
@staticmethod
def readDB(curObj, sql):
curObj.execute(sql)
result = curObj.fetchall()
return result #对数据库进行读操作
@staticmethod
def writeDB(dbObj, curObj, sql):
try:
curObj.execute(sql)
dbObj.commit() #对数据库进行写操作
return 0
except:
dbObj.rollback() #回滚
return -1
@staticmethod
def closeDB(dbObj, curObj):
dbObj.close()
curObj.close() #关闭数据库
dbdata.py #存放数据库连接信息(可以不进行类的封装)
class dbdata:
host='localhost'
user='root'
passwd='123456'
Port=3306
db='school'