京东数据库案例练习
一. 准备数据
该案例使用前面章节中完成的京东商品数据库.
二. 程序菜单
print('1. 查询所有商品信息')
print("2. 查询所有包含商品的分类")
print("3. 添加新商品分类")
print("4. 将所有商品价格加1000")
print("5. 将所有笔记本的分类改为超级本")
print("6. 根据id查询商品信息")
print("7. 根据id查询商品信息安全方式")
print("8. 退出系统")
三. 方法命名
# 显示菜单方法
def __print_menu(self):
pass
# 打印结果方法
def __show_query_result(self, result):
pass
# 服务器运行方法,实现主体逻辑
def run(self):
pass
# 1. 查询所有商品信息
def __fetch_all_info(self):
pass
# 2. 查询所有包含商品的分类
def __fetch_cate_of_goods(self):
pass
# 3. 添加商品分类
def __add_new_cate(self):
pass
# 4. 将所有商品价格加1000
def __update_price(self):
pass
# 5. 将所有笔记本的分类改为超级本
def __update_cate(self):
pass
# 6. 根据id查询商品信息
def __fetch_info_with_id(self):
pass
# 7. 根据id查询商品信息安全方式
def __fetch_info_with_id_safe(self):
pass
四. 代码实现
- 判断当前是否是主程序入口
if __name__ == '__main__': main() - 实现主函数
def main(): # 创建服务器对象,并传入相应参数 jd = JDServer('jd', 'root', '123123') # 启动服务器 jd.run() 实现 JD 类
import pymysql class JDServer(object): """JD 类,提供商品查询服务""" # 将数据库连接操作放到初化方法中,对象创建时,自动连接数据库 def __init__(self, target_db, username, password): # 连接数据库 self.db_connect = pymysql.Connect(host='localhost',port=3306,database=target_db, user=username, passwd=password, charset='utf8') # 将数据库关闭操作放到 __del__方法中,当对象销毁时,自动关闭数据库 def __del__(self): # 关闭数据库 self.db_connect.close()- 实现 run 方法
因为需要重复选择,所以要用死循环
# 服务器运行方法,实现主体逻辑,通过判断输入选择相应的功能函数 def run(self): while True: self.__print_menu() select_id = input('请输入功能ID:') if select_id == '1': self.__fetch_all_info() elif select_id == '2': self.__fetch_cate_of_goods() elif select_id == '3': self.__add_new_cate() elif select_id == '4': self.__update_price() elif select_id == '5': self.__update_cate() elif select_id == '6': self.__fetch_info_with_id() elif select_id == '7': self.__fetch_info_with_id_safe() elif select_id == '8': break else: print('输入功能不正确,请重新输入') - 实现一个显示方法,用来输出结果
# 用来显示结果的方法,私有,对外不可见 def __show_query_result(self, result): for item in result: print(item) - 实现查询所有商品信息
# 1. 查询所有商品信息 def __fetch_all_info(self): cur = self.db_connect.cursor() sql_str = '''select * from goods''' cur.execute(sql_str) result = cur.fetchall() self.__show_query_result(result) cur.close() - 查询所有包含商品的分类
# 2. 查询所有包含商品的分类 def __fetch_cate_of_goods(self): cur = self.db_connect.cursor() sql_str = '''select distinct good_cates.name from goods inner join good_cates on goods.cate_id = good_cates.id;''' # sql_str = ''' select name from good_cates where id in (select distinct cate_id from goods); ''' cur.execute(sql_str) result = cur.fetchall() self.__show_query_result(result) cur.close() - 添加商品分类
# 3. 添加商品分类 def __add_new_cate(self): new_cate = input('请输入一个新商品分类:') sql_str = ''' insert into good_cates(name) values("%s") ''' % new_cate cur = self.db_connect.cursor() cur.execute(sql_str) self.db_connect.commit() cur.close() - 将所有商品价格加1000
# 4. 将所有商品价格加1000 def __update_price(self): cur = self.db_connect.cursor() sql_str = ''' update goods set price = price + 1000''' cur.execute(sql_str) self.db_connect.commit() cur.close() - 将所有笔记本的分类改为超级本
# 5. 将所有笔记本的分类改为超级本 def __update_cate(self): cur = self.db_connect.cursor() sql_str = '''update goods set cate_id = (select id from good_cates where name = '超级本') where name like '%笔记本%';''' cur.execute(sql_str) self.db_connect.commit() cur.close() - 根据id 查找商品,会产生SQL注入问题
# 6. 根据id查询商品信息 def __fetch_info_with_id(self): s_id = input('请输入一个商品ID:') sql_str = ''' select * from goods where id = %s ''' % s_id print(sql_str) cur = self.db_connect.cursor() cur.execute(sql_str) result = cur.fetchall() self.__show_query_result(result) cur.close() - 根据id查询商品信息安全方式,案例防注入
# 7. 根据id查询商品信息安全方式 def __fetch_info_with_id_safe(self): s_id = input('请输入一个商品ID:') sql_str = ''' select * from goods where id = %s ''' print(sql_str) cur = self.db_connect.cursor() cur.execute(sql_str, (s_id,)) result = cur.fetchall() self.__show_query_result(result) cur.close()