Python与MySQL交互

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
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
相关文章
|
4月前
|
存储 安全 搜索推荐
课时15:Python的交互模式
今天给大家带来的分享是 Python 的交互模式以及计算机对 Python 的开发,分为以下三个部分。 1.Python的介绍 2.Python的结构 3.保存代码
|
5月前
|
SQL 关系型数据库 MySQL
Python中使用MySQL模糊查询的方法
本文介绍了两种使用Python进行MySQL模糊查询的方法:一是使用`pymysql`库,二是使用`mysql-connector-python`库。通过这两种方法,可以连接MySQL数据库并执行模糊查询。具体步骤包括安装库、配置数据库连接参数、编写SQL查询语句以及处理查询结果。文中详细展示了代码示例,并提供了注意事项,如替换数据库连接信息、正确使用通配符和关闭数据库连接等。确保在实际应用中注意SQL注入风险,使用参数化查询以保障安全性。
|
7月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
843 15
|
8月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
169 1
|
7月前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
189 0
|
9月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
137 1
|
人工智能 C语言 C++
Python 与 C/C++ 交互的几种方式
  python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多。但是优点也必然也伴随着缺点(这是肯定的,不然还要其他语言干嘛),python最被人诟病的一个地方可能就是其运行速度了。
1214 0
|
4月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
2月前
|
数据采集 安全 BI
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
84 11
|
4月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
140 28

推荐镜像

更多