在上一篇博文中我们详细的讲了一些MySQL
的查询相关的知识,相信大家已经对MySQL
的查询的相关操作已经熟稔于心。这篇博文我们来讲一些实战性的东西,也就是如何用Python
语言来操作MySQL
数据库。好了,话不多说,让我们开始吧!
准备数据
准备数据表
1 | -- 创建 "京东" 数据库 |
插入数据
1 | -- 向goods表中插入数据 |
SQL演练
SQL语句的强化
- 查询类型
cate_name
为’超极本’的商品名称、价格
1 | select name,price from goods where cate_name = '超级本'; |
- 显示商品的种类
1 | select cate_name from goods group by cate_name; |
- 求所有电脑产品的平均价格,并且保留两位小数
1 | select round(avg(price),2) as avg_price from goods; |
- 显示每种商品的平均价格
1 | select cate_name,avg(price) from goods group by cate_name; |
- 查询每种类型的商品中 最贵、最便宜、平均价、数量
1 | select cate_name,max(price),min(price),avg(price),count(*) from goods group by cate_name; |
- 查询所有价格大于平均价格的商品,并且按价格降序排序
1 | select id,name,price from goods |
- 查询每种类型中最贵的电脑信息
1 | select * from goods |
创建 “商品分类”” 表
1 | -- 创建商品分类表 |
- 查询
goods
表中商品的种类
1 | select cate_name from goods group by cate_name; |
- 将分组结果写入到
goods_cates
数据表
1 | insert into goods_cates (name) select cate_name from goods group by cate_name; |
同步表数据
- 通过goods_cates数据表来更新goods表
1 | update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id; |
创建 “商品品牌表”
- 通过
create...select
来创建数据表并且同时写入记录,一步到位
1 | -- select brand_name from goods group by brand_name; |
同步数据
- 通过
goods_brands
数据表来更新goods
数据表
1 | update goods as g inner join goods_brands as b on g.brand_name=b.name set g.brand_name=b.id; |
修改表结构
- 查看
goods
的数据表结构,会发现cate_name
和brand_name
对应的类型为varchar
但是存储的都是数字
1 | desc goods; |
- 通过
alter table
语句修改表结构
1 | alter table goods |
外键
- 分别在
goods_cates
和goods_brands
表中插入记录
1 | insert into goods_cates(name) values ('路由器'),('交换机'),('网卡'); |
- 在
goods
数据表中写入任意记录
1 | insert into goods (name,cate_id,brand_id,price) |
- 查询所有商品的详细信息 (通过内连接)
1 | select g.id,g.name,c.name,b.name,g.price from goods as g |
- 查询所有商品的详细信息 (通过左连接)
1 | select g.id,g.name,c.name,b.name,g.price from goods as g |
如何防止无效信息的插入,就是可以在插入前判断类型或者品牌名称是否存在呢? 可以使用之前讲过的外键来解决
外键约束:对数据的有效性进行验证
- 关键字:
foreign key
,只有innodb
数据库引擎支持外键约束 - 对于已经存在的数据表 如何更新外键约束
1 | -- 给brand_id 添加外键约束成功 |
- 如何在创建数据表的时候就设置外键约束呢?
- 注意:
goods
中的cate_id
的类型一定要和goods_cates
表中的id
类型一致
1 | create table goods( |
- 如何取消外键约束
1 | -- 需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称 |
- 在实际开发中,很少会使用到外键约束,会极大的降低表更新的效率
数据库的设计
创建 “商品分类” 表(之前已经创建,无需再次创建)
1 | create table goods_cates( |
创建 “商品品牌” 表(之前已经创建,无需再次创建)
1 | create table goods_brands ( |
创建 “商品” 表(之前已经创建,无需再次创建)
1 | create table goods( |
创建 “顾客” 表
1 | create table customer( |
创建 “订单” 表
1 | create table orders( |
创建 “订单详情” 表
1 | create table order_detail( |
说明
- 以上创建表的顺序是有要求的,即如果
goods
表中的外键约束用的是goods_cates
或者是goods_brands
,那么就应该先创建这2个表,否则创建goods
会失败 - 创建外键时,一定要注意类型要相同,否则失败
Python
中操作MySQL
步骤
引入模块
- 在
python
文件中引入pymysql
模块(python3
)
1 | from pymysql import * |
Connection
对象
- 用于建立与数据库的连接
- 创建对象:调用
connect()
方法
1 | conn=connect(参数列表) |
- 参数
host
:连接的mysql
主机,如果本机是’localhost’ - 参数
port
:连接的mysql
主机的端口,默认是3306
- 参数
database
:数据库的名称 - 参数
user
:连接的用户名 - 参数
password
:连接的密码 - 参数
charset
:通信采用的编码方式,推荐使用utf8
对象的方法
close()
关闭连接commit()
提交cursor()
返回Cursor
对象,用于执行sql
语句并获得结果
Cursor对象
- 用于执行
sql
语句,使用频度最高的语句为select、insert、update、delete
- 获取
Cursor
对象:调用Connection
对象的cursor()
方法
1 | cs1=conn.cursor() |
对象的方法
close()
关闭execute(operation [, parameters ])
执行语句,返回受影响的行数,主要用于执行insert、update、delete
语句,也可以执行create、alter、drop
等语句fetchone()
执行查询语句时,获取查询结果集的第一个行数据,返回一个元组fetchall()
执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
对象的属性
rowcount
只读属性,表示最近一次execute()
执行后受影响的行数connection
获得当前连接对象
增删改查
增删改
1 | from pymysql import * |
查询一行数据
1 | from pymysql import * |
查询多行数据
1 | from pymysql import * |
参数化
sql
语句的参数化,可以有效防止sql
注入- 注意:此处不同于
python
的字符串格式化,全部使用%s
占位
1 | from pymysql import * |