python与MySQL交互

  • 一、数据准备
  • 二、pymysql模块的使用
  • 三、实例的介绍
    • 1. 面向对象的方法 完成查询
    • 2. 添加增加功能
    • 3.查询-->包含sql注入
    • 4.解决sql注入
  • 四、总结

一、数据准备

  1. 数据库准备

    -- 数据准备-- 创建京东数据库create database jing_dong charset=utf8;-- 创建一个商品goods数据表create table goods(id int unsigned primary key auto_increment not null,name varchar(150) not null,cate_name varchar(40) not null,brand_name varchar(40) not null,price decimal(10,3) not null default 0,is_show bit not null default 1,is_saleoff bit not null default 0);-- 添加数据insert into goods values(0, 'r518vc 15.6英寸笔记本','笔记本','华硕','3399' , default, default);insert into goods values(0, 'y400 14.0英寸笔记本','笔记本','联想','4999' , default, default);insert into goods values(0, 'g150th 15.6英寸笔记本','游戏本','雷神','8499' , default, default);insert into goods values(0, 'x550c 15.6英寸笔记本','笔记本','华硕','2799' , default, default);insert into goods values(0, 'x240 超极本','超极本','联想','4880' , default, default);insert into goods values(0, 'u330p 13.3英寸超级本','超级本','索尼','4299' , default, default);insert into goods values(0, 'svp13226scb 触控超极本','超级本','索尼','7999' , default, default);insert into goods values(0, 'ipad mini 7.9英寸平板电脑','平板电脑','苹果','1998' , default, default);insert into goods values(0, 'ipad air 9.7英寸平板电脑','平板电脑','苹果','3388' , default, default);insert into goods values(0, 'ipad mini 显示屏','显示屏','苹果','2799' , default, default);insert into goods values(0, 'ideacentre c340 20英寸一题电脑','台式机','戴尔','2899' , default, default);insert into goods values(0, 'imac 一体电脑','台式机','苹果','9188' , default, default);insert into goods values(0, 'at7 台式电脑 linux','台式机','宏碁','3699' , default, default);insert into goods values(0, 'z22 工作站','服务器/工作站','惠普','4288' , default, default);insert into goods values(0, 'pow ii 服务器','服务器/工作站','戴尔','5388' , default, default);insert into goods values(0, 'mac pro专业台式电脑','笔记本','苹果','28888' , default, default);insert into goods values(0, 'hmz 头戴显示器','笔记本配件','索尼','6999' , default, default);insert into goods values(0, '商务双肩包','笔记本配件','索尼','99' , default, default);insert into goods values(0, 'x3250 m4服务器','服务器/工作站','ibm','6888' , default, default);insert into goods values(0, '商务双肩包','笔记本配件','索尼','99' , default, default);
    
  2. SQL语句的强化

    -- SQL强化-- 查询笔记本为超极本的select * from goods where cate_name="超极本";-- 只看 name 和 价格select name as 名字, price as 价格 from goods where cate_name="超极本";-- 显示商品的种类select cate_name from goods;select distinct cate_name from goods;select cate_name from goods group by cate_name;-- 每种商品种类中的名称select cate_name, group_concat(name) from goods group by cate_name;-- 求所有商品的平均价格select avg(price) from goods;select round(avg(price), 2) from goods;-- 显示每种商品的平均价格select cate_name, avg(price) from goods group by cate_name;-- 查询 最贵 最便宜 数量select cate_name, avg(price), max(price), min(price), count(*) from goods group by cate_name;-- 大于平均价格的select * from goods where price>(select avg(price) from goods);-- 查询每种商品当中最贵商品的信息select * from (select cate_name, max(price) as max_price from goods group by cate_name) as g_newleft join goods as g on g.price=g_new.max_price and g.cate_name=g_new.cate_name;-- 将数据表中的数据拆出来 拆成N张表-- 创建"商品分类表"   create table if not exists goods_cates(id int unsigned primary key auto_increment,name varchar(40) not null );-- 向 商品分类表中存信息select cate_name from goods group by cate_name;  -- 查询分类insert into goods_cates (name) select cate_name from goods group by cate_name;  -- 这个时候不用写valuses-- 修改goods中商品的信息 将cate_name 改成另一个表的idupdate goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;-- 修改goods的表结构 用alter changealter table goods change cate_name cate_id int unsigned not null;-- goods添加关联 cate_id --> goods_cates 的id-- 1.添加外键  2.程序里面控制  谈价外键的时候会检查cate_id 和 id 时候有alter table goods add foreign key (cate_id) references goods_cates(id); -- 添加一个品牌表 并向里面添加关联数据-- 擦混国家爱你表并添加数据 添加数据的时候查出来的哪个name要相同create table if not exists goods_brands(id int unsigned primary key auto_increment,name varchar(40) not null) select brand_name as name from goods group by brand_name;-- 关联goods 和goods_brandsupdate goods as g inner join goods_brands as b on b.name=g.name set g.brand_name=b.id;-- 修改表结构alter table goods change brand_name brand_id int unsigned not null;-- 添加外键约束alter table goods add foreign key (brand_id) references goods_brands(id);-- 删除外键约束--查询结果    --  | goods | CREATE TABLE `goods` (--   `id` int unsigned NOT NULL AUTO_INCREMENT,--   `name` varchar(150) NOT NULL,--   `cate_id` int unsigned NOT NULL,--   `brand_id` int unsigned NOT NULL,--   `price` decimal(10,3) NOT NULL DEFAULT '0.000',--   `is_show` bit(1) NOT NULL DEFAULT b'1',--   `is_saleoff` bit(1) NOT NULL DEFAULT b'0',--   PRIMARY KEY (`id`),--   KEY `cate_id` (`cate_id`),--   KEY `brand_id` (`brand_id`),--   CONSTRAINT `goods_ibfk_1` FOREIGN KEY (`cate_id`) REFERENCES `goods_cates` (`id`),--   CONSTRAINT `goods_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `goods_brands` (`id`)-- ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 |-- 删除外键-- alter table goods drop foreign key 外键名;alter table goods drop foreign key 'goods_ibfk_1';
    
  3. pymysql安装

     pip install pymysql
    

二、pymysql模块的使用

  1. 链接数据库

    conn = connect(host="localhost", port=3306, user="root", password="123456", database="jing_dong", charset='utf8')
    
  2. 获取游标对象

    cs1 = conn.cursor()
    
  3. 执行sql语句

    count = cs1.execute("select * from goods")  # count记录的是受影响的行数
    
  4. 获取返回数据:
    4.1 cs1.fetchone() :获取一条数据–>一个元组
    4.2 cs1.fetchall() # 取出所有数据 元组里面嵌元组
    4.3 cs1.fetchmany(5) : 获取五条数据

  5. 关闭

    cs1.close()  # 关闭游标
    conn.close()  # 关闭连接
    

三、实例的介绍

1. 面向对象的方法 完成查询

  1. 查询

    from pymysql import connect# 用类完成
    class JD(object):def __init__(self):# 连接数据库self.conn = connect(host="localhost", port=3306, user="root", password="123456", database="jing_dong", charset='utf8')# 获取游标对象self.cursor = self.conn.cursor()def __del__(self):# 关闭连接self.conn.close()self.cursor.close()@staticmethoddef print_menu():# 静态方法没什么值也不用传print("------京东------")print("0. 退出")print("1. 查询所有的商品")print("2. 查询所有的品牌分类")print("3. 查询所有的商品分类")return input("请输入功能所对应的序号:")def execute_sql(self, sql):# 输出查询内容# 输出查询内容self.cursor.execute(sql)for item in self.cursor.fetchall():print(item)def show_all_items(self):"""查询所有商品"""sql = "select * from goods"self.execute_sql(sql)def show_cates(self):"""查询所有商品分类"""sql = "select name from goods_cates"self.execute_sql(sql)def show_brands(self):"""查询所有品牌分类"""sql = "select name from goods_brands"self.execute_sql(sql)   def run(self):"""运行"""while True:num = self.print_menu()if num == "1":self.show_all_items()elif num == "2":self.show_cates()elif num == "3":self.show_brands()elif num == "0":breakelse:print("输入错误请重新输入")def main():"""完成整体的控制"""# 1. 创建一个京东商城的对象jd = JD()# 2. 调用这个对象的run方法,让其运行jd.run()if __name__ == "__main__":main()

2. 添加增加功能

  1. 添加增加的功能

    """增删改查-面向对象"""
    from pymysql import connect# 用类完成
    class JD(object):def __init__(self):# 连接数据库self.conn = connect(host="localhost", port=3306, user="root", password="123456", database="jing_dong", charset='utf8')# 获取游标对象self.cursor = self.conn.cursor()def __del__(self):# 关闭连接self.conn.close()self.cursor.close()@staticmethoddef print_menu():# 静态方法没什么值也不用传print("------京东------")print("0. 退出")print("1. 查询所有的商品")print("2. 查询所有的品牌分类")print("3. 查询所有的商品分类")print("4. 增加商品p品牌种类")return input("请输入功能所对应的序号:")def execute_sql(self, sql):# 输出查询内容self.cursor.execute(sql)for item in self.cursor.fetchall():print(item)def show_all_items(self):"""查询所有商品"""sql = "select * from goods"self.execute_sql(sql)def show_cates(self):"""查询所有商品分类"""sql = "select name from goods_cates"self.execute_sql(sql)def show_brands(self):"""查询所有品牌分类"""sql = "select name from goods_brands"self.execute_sql(sql)def add_brands(self):"""增加品牌"""item = input("请输入要添加的品牌:")sql = """insert into goods_brands (name) values ("%s")""" % itemself.cursor.execute(sql)# 提交 增删改 必须有这个self.conn.commit()def run(self):"""运行"""while True:num = self.print_menu()if num == "1":self.show_all_items()elif num == "2":self.show_cates()elif num == "3":self.show_brands()elif num == "4":self.add_brands()elif num == "0":breakelse:print("输入错误请重新输入")def main():"""完成整体的控制"""# 1. 创建一个京东商城的对象jd = JD()# 2. 调用这个对象的run方法,让其运行jd.run()if __name__ == "__main__":main()

3.查询–>包含sql注入

  1. 查询–sql注入

    """增删改查-面向对象  sql注入"""
    from pymysql import connect# 用类完成
    class JD(object):def __init__(self):# 连接数据库self.conn = connect(host="localhost", port=3306, user="root", password="123456", database="jing_dong", charset='utf8')# 获取游标对象self.cursor = self.conn.cursor()def __del__(self):# 关闭连接self.conn.close()self.cursor.close()@staticmethoddef print_menu():# 静态方法没什么值也不用传print("------京东------")print("0. 退出")print("1. 查询所有的商品")print("2. 查询所有的品牌分类")print("3. 查询所有的商品分类")print("4. 增加商品品牌种类")print("5. 查询商品")return input("请输入功能所对应的序号:")def execute_sql(self, sql):# 输出查询内容self.cursor.execute(sql)for item in self.cursor.fetchall():print(item)def show_all_items(self):"""查询所有商品"""sql = "select * from goods"self.execute_sql(sql)def show_cates(self):"""查询所有商品分类"""sql = "select name from goods_cates"self.execute_sql(sql)def show_brands(self):"""查询所有品牌分类"""sql = "select name from goods_brands"self.execute_sql(sql)def add_brands(self):"""增加品牌"""item = input("请输入要添加的品牌:")sql = """insert into goods_brands (name) values ("%s")""" % itemself.cursor.execute(sql)# 提交 增删改 必须有这个self.conn.commit()def get_info_by_name(self):"""查询商品信息+sql注入"""# 当用户输入的是: 'or 1=1 or '1 时会出现sql注入  --> 前面的'和自己写的sql语句中的'进行匹配,使得其出现三个判断语句,期中一个成功则将会将所有的信息查出find_name = input("请输入要查询的商品信息:")sql = """select * from goods where name='%s'""" % find_nameself.execute_sql(sql)def run(self):"""运行"""while True:num = self.print_menu()if num == "1":self.show_all_items()elif num == "2":self.show_cates()elif num == "3":self.show_brands()elif num == "4":self.add_brands()elif num == "5":self.get_info_by_name()elif num == "0":breakelse:print("输入错误请重新输入")def main():"""完成整体的控制"""# 1. 创建一个京东商城的对象jd = JD()# 2. 调用这个对象的run方法,让其运行jd.run()if __name__ == "__main__":main()

4.解决sql注入

  1. 解决sql注入

    """增删改查-面向对象  解决sql注入"""
    from pymysql import connect# 用类完成
    class JD(object):def __init__(self):# 连接数据库self.conn = connect(host="localhost", port=3306, user="root", password="123456", database="jing_dong", charset='utf8')# 获取游标对象self.cursor = self.conn.cursor()def __del__(self):# 关闭连接self.conn.close()self.cursor.close()@staticmethoddef print_menu():# 静态方法没什么值也不用传print("------京东------")print("0. 退出")print("1. 查询所有的商品")print("2. 查询所有的品牌分类")print("3. 查询所有的商品分类")print("4. 增加商品品牌种类")print("5. 查询商品")return input("请输入功能所对应的序号:")def execute_sql(self, sql):# 输出查询内容self.cursor.execute(sql)for item in self.cursor.fetchall():print(item)def show_all_items(self):"""查询所有商品"""sql = "select * from goods"self.execute_sql(sql)def show_cates(self):"""查询所有商品分类"""sql = "select name from goods_cates"self.execute_sql(sql)def show_brands(self):"""查询所有品牌分类"""sql = "select name from goods_brands"self.execute_sql(sql)def add_brands(self):"""增加品牌"""item = input("请输入要添加的品牌:")sql = """insert into goods_brands (name) values ("%s")""" % itemself.cursor.execute(sql)# 提交 增删改 必须有这个self.conn.commit()def get_info_by_name(self):"""查询商品信息+解决sql注入"""# 当用户输入的是: 'or 1=1 or '1 时会出现sql注入  --> 前面的'和自己写的sql语句中的'进行匹配,使得其出现三个判断语句,期中一个成功则将会将所有的信息查出# 解决方法将sql语句让其自己拼接find_name = input("请输入要查询的商品信息:")sql = 'select * from goods where name=%s'self.cursor.execute(sql, [find_name])print(self.cursor.fetchall())def run(self):"""运行"""while True:num = self.print_menu()if num == "1":self.show_all_items()elif num == "2":self.show_cates()elif num == "3":self.show_brands()elif num == "4":self.add_brands()elif num == "5":self.get_info_by_name()elif num == "0":breakelse:print("输入错误请重新输入")def main():"""完成整体的控制"""# 1. 创建一个京东商城的对象jd = JD()# 2. 调用这个对象的run方法,让其运行jd.run()if __name__ == "__main__":main()

四、总结

  1. 在查询语句中需要拼接字符串的时候要用列表或者元组代替让cursor.execute自己完成拼接,可以防止sql注入
  2. 完成查询后要记得关闭链接否则会占用资源

python与mysql交互详解相关推荐

  1. 跟我学python之mysql操作详解 一、查询操作

    在python中,我们使用PyMySQL来操作mysql. 一.安装PyMySQL: 使用pip进行安装,命令为: pip install PyMySQL 二.在进行操作之前,首先要打开本机的mysq ...

  2. Python安装MySQL库详解(解决Microsoft Visual C++ 9.0 is required )

    前面我们介绍的Python网络爬虫通常将抓取的数据存储至TXT或CSV文件,而当数据量增加之时,就需要将其存储至本地数据库了.Python访问数据库需要对应的接口程序,我们可以把接口程序理解为Pyth ...

  3. pandas读写MySQL数据库详解及实战

    pandas读写MySQL数据库详解及实战 SQLAlchemy是Python中最有名的ORM工具. 关于ORM: 全称Object Relational Mapping(对象关系映射). 特点是操纵 ...

  4. python之sys模块详解_(转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  5. python的图书管理项目教程_基于python图书馆管理系统设计实例详解

    写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担 ...

  6. Python Turtle 海龟绘图详解官方文档中文版

    Python Turtle 海龟绘图详解 (官方文档中文版)-安徽省太湖中学陈晓中整理 概述 海龟绘图很适合用来引导孩子学习编程. 最初来自于 Wally Feurzeig, Seymour Pape ...

  7. 【Python】python之subprocess模块详解

    [Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...

  8. python 拼音库_python有没有拼音库python进阶之socket详解

    Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句 ...

  9. python图书馆管理系统实验报告_基于python图书馆管理系统设计实例详解

    写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担 ...

最新文章

  1. 【Paper】2017_Distributed control for high-speed trains movements
  2. mysql 有索引 不被使用方法_MySQL教程100-索引在什么情况下不会被使用?
  3. 大数据文本分析的应用场景有哪些?
  4. Vue组件化之VueComponent介绍
  5. 双层感知机解决异或问题
  6. PHP按上下级层次关系输出内容
  7. 开源阅读书源_免费开源网络文学阅读器(万本小说免费阅读)
  8. 【案例】做一个电话簿(二)
  9. 000webhost免费申请
  10. 【java】java intellij idea 破解
  11. 测试理论-代码的检查,走查(三)
  12. 为什么某些Win32技术在Windows NT服务中行为不当?
  13. 1.5 日本の会社で働くのは、初めてなので、不安です
  14. c与c++的struct区别
  15. 大数据带给国防动员哪些机遇?
  16. LOL九周年战斗之夜 钻石宝箱获取攻略
  17. Linux实现多用户登录 用户管理
  18. 动手实现简易网站目录扫描器——WebScanner
  19. List集合根据相同属性合并同类项
  20. FreeRTOS 中 RISC-V-Qemu-virt_GCC 的 运行流程 的异常分析

热门文章

  1. pandas 分类汇总等一些用法
  2. python pandas dataframe drop_duplicates 去重
  3. 张一鸣讽刺「互联网八股文」!
  4. 激发员工工作动力的励志名言100句
  5. JProfiler10 序列号
  6. 科技爱好者周刊(第 220 期):人工智能的机会在哪里
  7. 子弹短信,终于更新了一些有意思的功能
  8. .user.ini文件 无法删除解决办法
  9. php 进程与线程,php进程和线程的区别
  10. JavaScript高级程序设计---第五章 基本引用类型