Python连接MySQL及查询实战

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Python连接MySQL及查询实战

1Python DB-API

1.1概述

  • Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。
  • PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个实现库,Python2中则使用mysqldb。
  • PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

1.2安装PyMySQL

  • 在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装。
  • PyMySQL下载地址:https://github.com/PyMySQL/PyMySQL
  • 如果还未安装,我们可以使用以下命令安装最新版的 PyMySQL: pip install PyMySQL

1.3连接数据库

  • 数据库准备,连接数据库之前,请确保已经创建了python数据库,以及students表
  • 创建Connection对象:用于建立与数据库的连接
from pymysql import * 
# 导入pymysql模块 
# 创建连接对象 Connection对象 
# host:数据库主机地址 
# user:数据库账号 
# password:数据库密码 
# database : 需要连接的数据库的名称 
# port: mysql的端口号 
# charset: 通信采用编码格式 
conn = connect(host='127.0.0.1', user='root', password='mysql', database='python', port=3306, charset='utf8')
  • Connection 连接对象拥有的方法
  • close 关闭连接,连接数据库跟打开文件一样,操作完成之后需要关闭,否则会占用连接。
  • commit()提交,pymysql 默认开启事物,所以每次更新数据库都要提交
  • rollback()回滚,事物回滚
  • cursor()返回Cursor对象,用于执行sql语句并获得结果
  • 获取cursor对象
cur = conn.cursor() # cursor对象用于执行sql语句
  • cursor对象拥有的方法
  • close()关闭cursor对象
  • execute(operation [, parameters ])执行语句,返回受影响的行数,可以执行所有语句
  • fetchone()获取查询结果集的第一个行数据,返回一个元组
  • fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
  • 插入数据
res = cur.execute('insert into students VALUES (0,"白里守约",0,"广州",2,18);’) 
print(res) # 查看受影响的行数 
conn.commit() # 提交事物
  • 查询数据:
cur.execute('select * from students;') # 执行sql语句,select * from students; 
res = cur.fetchone() # 获取结果集的第一条数据 
res1 = cur.fetchall() # 获取结果及的所有数据 
print(res) # 将获取的查询结果打印 
print(res1)
  • 执行sql语句参数化,参数化sql语句中使用%s占位。
  • execute(operation [parameters])
  • 执行语句,返回受影响的行数,可以执行所有语句 [parameters] 参数列表
sql = 'select * from students where id=%s and gender= %s;' # sql语句中使用%s占位 
#执行sql语句          
cur.execute(sql,[15,0])

实例:

from pymysql import *
#创建数据库的连接
conn=connect(host='192.168.117.128',user='root',password='111111',
             database='stuDB',charset='utf8')
#创建一个游标对象 可以利用这个对象进行数据库的操作
try:
    cur=conn.cursor()
    insertsql='''
    insert into student(id,name,hometown) values (66,'钱之坑','北京市')
    '''
    cur.execute('select * from student where id=%s',[66])
    # conn.commit()
    res=cur.fetchall()
    for item in res:
        print('姓名;{0} 地址{1}'.format(item[1],item[3]))
    print(res)
    #print('sucess')
except Exception as ex:
    print(ex)
finally:
    cur.close()
    conn.close()

2查询实战

2.1准备数据

  • 创建表
create table goods( 
id int unsigned primary key auto_increment not null, 
name varchar(150) not null, 
cate varchar(40) not null, 
brand_name varchar(40) not null, 
price decimal(10,3) not null default 0 
);
  • 使用insert语句,插入多条数据
insert into goods values(0,' Apple MacBook Air 13.3英寸笔记本电脑','笔记本','苹果','6588’); 
insert into goods values(0,'联想(Lenovo)拯救者R720 15.6英寸大屏','笔记本','联想','6099’); 
insert into goods values(0,'法国酒庄直采原瓶原装进口AOC级艾落干红葡萄酒','红酒','法国','499’); 
insert into goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799’); 
insert into goods values(0,'清扬(CLEAR)洗发水','洗发水','清扬','35’); 
......

2.2查询

  • 查询goods表中所有的商品
select * from goods;
  • 查询所有产品的平均价格,并且保留两位小数
select round(avg(price),2) as avg_price from goods;
  • 通过子查询来实现,查询所有价格大于平均价格的商品,并且按价格降序排序
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 where brand_name='联想';
  • 查询价格大于或等于"联想"价格的商品,并且按价格降序排列
select id,name,price from goods 
where price >= any(select price from goods where brand_name = '联想’) 
order by price desc;
  • 查询每个产品类型的最低价格的,通过cate字段进行分组。
select cate,min(price) from goods group by cate;
  • 查询价格区间在4500-6500之间的笔记本
select * from goods where price between 4500 and 6500 and cate='笔记本';

2.3查询数据分表

  • 创建一个商品表
create table if not exists goods_cates( 
cate_id int unsigned primary key auto_increment, 
cate_name varchar(40) 
);
  • 1、查询goods表中所有的商品,并且按"类别"分组
select cate from goods group by cate;
  • 2、将分组后的结果写入到刚才创建的表中
insert into goods_cates (cate_name) select cate from goods group by cate;
  • 3、通过goodscates数据表来更新goods表,将goods表中的cate字段,修改成goodscates的id字段
update goods as g inner join goods_cates as c on g.cate = c.cate_name 
set cate = cate_id;
  • 4、字段 brand_name 进行分表。
create table if not exists goods_brands( 
brand_id int unsigned primary key auto_increment, 
brand_name varchar(40) 
); 
insert into goods_brands(brand_name) select brand_name from goods group by brand_name;
  • 5、通过goodsbrands数据表来更新goods表,将goods表中的barndname字段,修改成goods_brands的id字段
update goods as g inner JOIN goods_brands as j on g.brand_name=j.brand_name 
set g.brand_name=j.brand_id;
  • 6、查看goods表结构,发现 cate, 、brand_name 两个字段都是varchar字段,需要修改成int类型字段。
desc goods; 
alter table goods change cate cate_id int unsigned not null, 
change brand_name brand_id int unsigned not null;
  • 7、通过左连接查询所有商品的信息
select id,name,cate_name,brand_name,price from goods as g 
left join goods_cates as c on g.cate_id = c.cate_id 
left join goods_brands as b on g.brand_id = b.brand_id;
  • 8、通过右连接查询所有商品的信息
select id,name,cate_name,brand_name,price from goods as g 
right join goods_cates as c on g.cate_id = c.cate_id 
right join goods_brands as b on g.brand_id = b.brand_id;
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
|
3天前
|
数据采集 算法 数据挖掘
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
LinkedIn 对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25 项技能中,数据挖掘排名第一。那么数据挖掘是什么? 数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此“数据挖掘”已成为企业保持竞争力的必要方法。 今天给小伙伴们分享的Python数据分析与数据挖掘手册是10余位数据挖掘领域资深专家和科研人员,10余年大数据挖掘咨询与实施经验结晶。从数据挖掘的应用出发,以电力、
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
|
2天前
|
数据采集 算法 数据挖掘
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
LinkedIn 对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25 项技能中,数据挖掘排名第一。那么数据挖掘是什么? 数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此“数据挖掘”已成为企业保持竞争力的必要方法。 今天给小伙伴们分享的Python数据分析与数据挖掘手册是10余位数据挖掘领域资深专家和科研人员,10余年大数据挖掘咨询与实施经验结晶。从数据挖掘的应用出发,以电力、
|
5天前
|
运维 Devops 测试技术
一个人活成一个团队:python的django项目devops实战
DevOps通过自动化的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战,通过DevOps拉通开发和运维,通过应用云效的DevOps平台实现自动化“软件交付”的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠,提交研发交付效率。作为个人项目也是可以应用devops提高效率。
17 3
|
4天前
|
关系型数据库 MySQL 索引
mysql8.0中fulltext不能查询到中文的解决方法
确保MySQL服务器字符集为`utf8mb4`,并设置`ngram_token_size=1`以支持单字搜索。如已更改此参数且存在全文索引,需删除原有索引并重建,使用`WITH PARSER ngram`指定解析器。例如: ``` ALTER TABLE your_table DROP INDEX idx_fulltext, ADD FULLTEXT INDEX idx_fulltext (your_column) WITH PARSER ngram; ```
|
7天前
|
存储 算法 关系型数据库
探索MySQL递归查询,优雅的给树结构分页!
总结起来,对于MySQL中的树结构数据,递归查询结合预排序遍历树算法可以实现优雅的分页,但需要注意性能优化和数据更新的问题。这项技术提供了一种高效处理层级数据的工具,使得开发者可以在复杂的数据结构下实现直观和可靠的数据查询。
16 1
|
1天前
|
canal 关系型数据库 MySQL
"揭秘阿里数据同步黑科技Canal:从原理到实战,手把手教你玩转MySQL数据秒级同步,让你的数据处理能力瞬间飙升,成为技术界的新晋网红!"
【8月更文挑战第18天】Canal是一款由阿里巴巴开源的高性能数据同步系统,它通过解析MySQL的增量日志(Binlog),提供低延迟、可靠的数据订阅和消费功能。Canal模拟MySQL Slave与Master间的交互协议来接收并解析Binary Log,支持数据的增量同步。配置简单直观,包括Server和Instance两层配置。在实战中,Canal可用于数据库镜像、实时备份等多种场景,通过集成Canal Client可实现数据的消费和处理,如更新缓存或写入消息队列。
16 0
|
3天前
|
存储 SQL 关系型数据库
探索MySQL的执行奥秘:从查询执行到数据存储与优化的深入解析
探索MySQL的执行奥秘:从查询执行到数据存储与优化的深入解析
|
人工智能 供应链 前端开发
【精品问答】Python实战100例 | 技术日报(16期)
【精品问答】Python实战100例,确定不mark吗?还有云计算招聘岗位全方位需求解析+学习路径指南精彩直播,对云计算感兴趣的高校生、职场新人看过来~
519 0
|
7天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1