京东数据库案例练习

一. 准备数据

该案例使用前面章节中完成的京东商品数据库.

二. 程序菜单

    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

四. 代码实现

  1. 判断当前是否是主程序入口
     if __name__ == '__main__':
         main()
    
  2. 实现主函数
     def main():
         # 创建服务器对象,并传入相应参数
         jd = JDServer('jd', 'root', '123123')
         # 启动服务器
         jd.run()
    
  3. 实现 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()
    
  4. 实现 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('输入功能不正确,请重新输入')
    
  5. 实现一个显示方法,用来输出结果
     # 用来显示结果的方法,私有,对外不可见
     def __show_query_result(self, result):
         for item in result:
             print(item)
    
  6. 实现查询所有商品信息
     # 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()
    
  7. 查询所有包含商品的分类
     # 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()
    
  8. 添加商品分类
     # 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()
    
  9. 将所有商品价格加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()
    
  10. 将所有笔记本的分类改为超级本
    # 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()
    
  11. 根据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()
    
  12. 根据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()