Python与MySQL交互

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 0.准备数据 创建数据表 – 创建 “京东” 数据库 create database jing_dong charset=utf8;– 使用 “京东” 数据库use jing_dong;– 创建一个商品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 dec


0.准备数据

   创建数据表

   – 创建 “京东” 数据库

   create database jing_dong charset=utf8;

– 使用 “京东” 数据库

use jing_dong;

– 创建一个商品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

);

   插入数据

   – 向goods表中插入数据

insert into goods values(0,‘r510vc 15.6英寸笔记本’,‘笔记本’,‘华硕’,‘3399’,default,default);

insert into goods values(0,‘y400n 14.0英寸笔记本电脑’,‘笔记本’,‘联想’,‘4999’,default,default);

insert into goods values(0,‘g150th 15.6英寸游戏本’,‘游戏本’,‘雷神’,‘8499’,default,default);

insert into goods values(0,‘x550cc 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 配备 retina 显示屏’,‘平板电脑’,‘苹果’,‘2788’,default,default);

insert into goods values(0,'ideacentre c340 20英寸一体电脑 ',‘台式机’,‘联想’,‘3499’,default,default);

insert into goods values(0,‘vostro 3800-r1206 台式电脑’,‘台式机’,‘戴尔’,‘2899’,default,default);

insert into goods values(0,‘imac me086ch/a 21.5英寸一体电脑’,‘台式机’,‘苹果’,‘9188’,default,default);

insert into goods values(0,‘at7-7414lp 台式电脑 linux )’,‘台式机’,‘宏碁’,‘3699’,default,default);

insert into goods values(0,‘z220sff f4f06pa工作站’,‘服务器/工作站’,‘惠普’,‘4288’,default,default);

insert into goods values(0,‘poweredge ii服务器’,‘服务器/工作站’,‘戴尔’,‘5388’,default,default);

insert into goods values(0,‘mac pro专业级台式电脑’,‘服务器/工作站’,‘苹果’,‘28888’,default,default);

insert into goods values(0,‘hmz-t3w 头戴显示设备’,‘笔记本配件’,‘索尼’,‘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);

1.SQL演练

1.1 SQL语句的强化

   查询类型cate_name为 ‘超极本’ 的商品名称、价格

   select name,price from goods where cate_name = ‘超级本’;

   显示商品的种类

   select cate_name from goods group by cate_name;

   求所有电脑产品的平均价格,并且保留两位小数

   select round(avg(price),2) as avg_price from goods;

   显示每种商品的平均价格

   select cate_name,avg(price) from goods group by cate_name;

   查询每种类型的商品中 最贵、最便宜、平均价、数量

   select cate_name,max(price),min(price),avg(price),count(* ) from goods group by cate_name;

   查询所有价格大于平均价格的商品,并且按价格降序排序

   select id,name,price from goods

   where price > (select round(avg(price),2) as avg_price from goods)

   order by price desc;

   查询每种类型中最贵的电脑信息

   select * from goods

   inner join

   (

   select

   cate_name,

   max(price) as max_price,

   min(price) as min_price,

   avg(price) as avg_price,

   count(* ) from goods group by cate_name

   ) as goods_new_info

   on goods.cate_name=goods_new_info.cate_name and goods.price=goods_new_info.max_price;

1.2 创建 "商品分类"表

   创建商品分类表

   create table if not exists goods_cates(

   id int unsigned primary key auto_increment,

   name varchar(40) not null

   );

   查询goods表中商品的种类

   select cate_name from goods group by cate_name;

   将分组结果写入到goods_cates数据表

   insert into goods_cates (name) select cate_name from goods group by cate_name;

1.3 同步表数据

   通过goods_cates数据表来更新goods表

   update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;

1.4 创建 “商品品牌表” 表

通过create…select来创建数据表并且同时写入记录,一步到位

– select brand_name from goods group by brand_name;

– 在创建数据表的时候一起插入数据

– 注意: 需要对brand_name 用as起别名,否则name字段就没有值

create table 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;

1.5 同步数据

通过goods_brands数据表来更新goods数据表

update goods as g inner join goods_brands as b on g.brand_name=b.name set g.brand_name=b.id;

1.6 修改表结构

   查看 goods 的数据表结构,会发现 cate_name 和 brand_name对应的类型为 varchar 但是存储的都是数字

   desc goods;

   通过alter table语句修改表结构

   alter table goods

   change cate_name cate_id int unsigned not null,

   change brand_name brand_id int unsigned not null;

1.7 外键

   分别在 goods_cates 和 goods_brands表中插入记录

   insert into good_cates(name) values (‘路由器’),(‘交换机’),(‘网卡’);

   insert into good_brands(name) values (‘海尔’),(‘清华同方’),(‘神舟’);

   在 goods 数据表中写入任意记录

   insert into goods (name,cate_id,brand_name,price)

   values(‘LaserJet Pro P1606dn 黑白激光打印机’, 12, 4,‘1849’);

   查询所有商品的详细信息 (通过内连接)

   select g.id,g.name,c.name,b.name,g.price from goods as g

   inner join goods_cates as c on g.cate_id=c.id

   inner join goods_brands as b on g.brand_id=b.id;

   查询所有商品的详细信息 (通过左连接)

   select g.id,g.name,c.name,b.name,g.price from goods as g

   left join goods_cates as c on g.cate_id=c.id

   left join goods_brands as b on g.brand_id=b.id;

   如何防止无效信息的插入,就是可以在插入前判断类型或者品牌名称是否存在呢? 可以使用之前讲过的外键来解决

外键约束:对数据的有效性进行验证

关键字: foreign key,只有 innodb数据库引擎 支持外键约束

对于已经存在的数据表 如何更新外键约束

– 给brand_id 添加外键约束成功

alter table goods add foreign key (brand_id) references goods_brands(id);

– 给cate_id 添加外键失败

– 会出现1452错误

– 错误原因:已经添加了一个不存在的cate_id值12,因此需要先删除

alter table goods add foreign key (cate_id) references goods_cates(id);

如何在创建数据表的时候就设置外键约束呢?

注意: goods 中的 cate_id 的类型一定要和 goods_cates 表中的 id 类型一致

create table goods(

id int primary key auto_increment not null,

name varchar(40) default ‘’,

price decimal(5,2),

cate_id int unsigned,

brand_id int unsigned,

is_show bit default 1,

is_saleoff bit default 0,

foreign key(cate_id) references goods_cates(id),

foreign key(brand_id) references goods_brands(id)

);

   如何取消外键约束

   – 需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称

   show create table goods;

   – 获取名称之后就可以根据名称来删除外键约束

   alter table goods drop foreign key 外键名称;

   在实际开发中,很少会使用到外键约束,会极大的降低表更新的效率

3.Python中操作Mysql

cmd安装 pip3 install pymysql

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wYKJCcjd-1570883230133)(evernotecid://6A164892-EBA1-4DDC-869E-9660D4D960A1/appyinxiangcom/18066868/ENResource/p408)]

3.1 引入模块

在py文件中引入pymysql模块

from pymysql import *

Connection 对象

用于建立与数据库的连接

3.2 创建对象:调用connect()方法

   conn=connect(参数列表)

   参数host:连接的mysql主机,如果本机是’localhost’

   参数port:连接的mysql主机的端口,默认是3306

   参数database:数据库的名称

   参数user:连接的用户名

   参数password:连接的密码

   -参数charset:通信采用的编码方式,推荐使用utf8

   对象的方法

   close()关闭连接

   commit()提交

   cursor()返回Cursor对象,用于执行sql语句并获得结果

3.3 Cursor对象

   用于执行sql语句,使用频度最高的语句为select、insert、update、delete

   获取Cursor对象:调用Connection对象的cursor()方法

   cs1=conn.cursor()

   对象的方法

   close()关闭

   execute(operation [, parameters ])执行语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句

   fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组

   fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回

   对象的属性

   rowcount只读属性,表示最近一次execute()执行后受影响的行数

   connection获得当前连接对象

4.增删改查

4.1增删改

from pymysql import *
def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()
    # 执行insert语句,并返回受影响的行数:添加一条数据
    # 增加
    count = cs1.execute('insert into goods_cates(name) values("硬盘")')
    #打印受影响的行数
    print(count)
    count = cs1.execute('insert into goods_cates(name) values("光盘")')
    print(count)
    # # 更新
    # count = cs1.execute('update goods_cates set name="机械硬盘" where name="硬盘"')
    # # 删除
    # count = cs1.execute('delete from goods_cates where id=6')
    # 提交之前的操作,如果之前已经之执行过多次的execute,那么就都进行提交
    conn.commit()
    # 关闭Cursor对象
    cs1.close()
    # 关闭Connection对象
    conn.close()
if __name__ == '__main__':
    main()

4.2 查询一行数据

from pymysql import *
def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()
    # 执行select语句,并返回受影响的行数:查询一条数据
    count = cs1.execute('select id,name from goods where id>=4')
    # 打印受影响的行数
    print("查询到%d条数据:" % count)
    for i in range(count):
        # 获取查询的结果
        result = cs1.fetchone()
        # 打印查询的结果
        print(result)
        # 获取查询的结果
    # 关闭Cursor对象
    cs1.close()
    conn.close()
if __name__ == '__main__':
    main()

4.3 查询多行数据

from pymysql import *
def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()
    # 执行select语句,并返回受影响的行数:查询一条数据
    count = cs1.execute('select id,name from goods where id>=4')
    # 打印受影响的行数
    print("查询到%d条数据:" % count)
    # for i in range(count):
    #     # 获取查询的结果
    #     result = cs1.fetchone()
    #     # 打印查询的结果
    #     print(result)
    #     # 获取查询的结果
    result = cs1.fetchall()
    print(result)
    # 关闭Cursor对象
    cs1.close()
    conn.close()
if __name__ == '__main__':
    main()

4.4 京东商城查询案例

from pymysql import connect
class JD(object):
    def __init__(self):
        # 创建connection连接
        self.conn = connect(host='localhost', port=3306, user='root', password='12345678', database='jing_dong',charset='utf8')
        # 获得cursor对象
        self.cursor = self.conn.cursor()
    def __del__(self):
        # 关闭cursor对象
        self.cursor.close()
        self.conn.close()
    def show_all_items(self, sql):
        """显示所有的商品"""
        self.cursor.execute(sql)
        for temp in self.cursor.fetchall():
            print(temp)
    @staticmethod
    def print_menu():
        print("------京东--------")
        print("1:所有的商品")
        print("2:所有的商品分类")
        print("3:所有的商品品牌分类")
        return input("请输入功能对应的序号:")
    def run(self):
        while True:
            num = self.print_menu()
            if num == '1':
                # 查询所有商品
                sql = "select * from goods;"
                self.show_all_items(sql)
            elif num == '2':
                # 查询分类
                sql = "select * from good_cates;"
                self.show_all_items(sql)
            elif num == '3':
                sql = "select * from goods_brands;"
                self.show_all_items(sql)
            else:
                pass
def main():
    # 1.创建一个京东商城的对象
    jd = JD()
    # 2.调用这个对象的run方法,让其运行
    jd.run()
if __name__ == '__main__':
    main()
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
206 15
|
1月前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
32 0
|
2月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
61 1
|
3月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
76 1
|
3月前
|
Python
Python软链接:Python 2与现代Python的交互
Python软链接:Python 2与现代Python的交互
38 4
|
3月前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
52 3
|
3月前
|
Python
Python软链接:Python 2与现代Python的交互
Python软链接:Python 2与现代Python的交互
30 0
|
4月前
|
SQL 关系型数据库 MySQL
30天拿下Python之使用MySQL
30天拿下Python之使用MySQL
57 0
|
17天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
44 3
|
17天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
47 3