python与mysql交互详解
python与MySQL交互
- 一、数据准备
- 二、pymysql模块的使用
- 三、实例的介绍
- 1. 面向对象的方法 完成查询
- 2. 添加增加功能
- 3.查询-->包含sql注入
- 4.解决sql注入
- 四、总结
一、数据准备
数据库准备
-- 数据准备-- 创建京东数据库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);
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';
pymysql安装
pip install pymysql
二、pymysql模块的使用
链接数据库
conn = connect(host="localhost", port=3306, user="root", password="123456", database="jing_dong", charset='utf8')
获取游标对象
cs1 = conn.cursor()
执行sql语句
count = cs1.execute("select * from goods") # count记录的是受影响的行数
获取返回数据:
4.1cs1.fetchone()
:获取一条数据–>一个元组
4.2cs1.fetchall()
# 取出所有数据 元组里面嵌元组
4.3cs1.fetchmany(5)
: 获取五条数据关闭
cs1.close() # 关闭游标 conn.close() # 关闭连接
三、实例的介绍
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. 添加增加功能
- 添加增加的功能
"""增删改查-面向对象""" 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注入
查询–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注入
解决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()
四、总结
- 在查询语句中需要拼接字符串的时候要用列表或者元组代替让cursor.execute自己完成拼接,可以防止sql注入
- 完成查询后要记得关闭链接否则会占用资源
python与mysql交互详解相关推荐
- 跟我学python之mysql操作详解 一、查询操作
在python中,我们使用PyMySQL来操作mysql. 一.安装PyMySQL: 使用pip进行安装,命令为: pip install PyMySQL 二.在进行操作之前,首先要打开本机的mysq ...
- Python安装MySQL库详解(解决Microsoft Visual C++ 9.0 is required )
前面我们介绍的Python网络爬虫通常将抓取的数据存储至TXT或CSV文件,而当数据量增加之时,就需要将其存储至本地数据库了.Python访问数据库需要对应的接口程序,我们可以把接口程序理解为Pyth ...
- pandas读写MySQL数据库详解及实战
pandas读写MySQL数据库详解及实战 SQLAlchemy是Python中最有名的ORM工具. 关于ORM: 全称Object Relational Mapping(对象关系映射). 特点是操纵 ...
- python之sys模块详解_(转)python之os,sys模块详解
python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...
- python的图书管理项目教程_基于python图书馆管理系统设计实例详解
写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担 ...
- Python Turtle 海龟绘图详解官方文档中文版
Python Turtle 海龟绘图详解 (官方文档中文版)-安徽省太湖中学陈晓中整理 概述 海龟绘图很适合用来引导孩子学习编程. 最初来自于 Wally Feurzeig, Seymour Pape ...
- 【Python】python之subprocess模块详解
[Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...
- python 拼音库_python有没有拼音库python进阶之socket详解
Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句 ...
- python图书馆管理系统实验报告_基于python图书馆管理系统设计实例详解
写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担 ...
最新文章
- 【Paper】2017_Distributed control for high-speed trains movements
- mysql 有索引 不被使用方法_MySQL教程100-索引在什么情况下不会被使用?
- 大数据文本分析的应用场景有哪些?
- Vue组件化之VueComponent介绍
- 双层感知机解决异或问题
- PHP按上下级层次关系输出内容
- 开源阅读书源_免费开源网络文学阅读器(万本小说免费阅读)
- 【案例】做一个电话簿(二)
- 000webhost免费申请
- 【java】java intellij idea 破解
- 测试理论-代码的检查,走查(三)
- 为什么某些Win32技术在Windows NT服务中行为不当?
- 1.5 日本の会社で働くのは、初めてなので、不安です
- c与c++的struct区别
- 大数据带给国防动员哪些机遇?
- LOL九周年战斗之夜 钻石宝箱获取攻略
- Linux实现多用户登录 用户管理
- 动手实现简易网站目录扫描器——WebScanner
- List集合根据相同属性合并同类项
- FreeRTOS 中 RISC-V-Qemu-virt_GCC 的 运行流程 的异常分析