python:pymysql概念、基本操作和注入问题讲解

python:pymysql分享目录

  • 一、概念
  • 二、数据准备
  • 三、安装pymysql
  • 四、pymysql使用
    • (一)使用步骤
    • (二)查询操作
    • (三)增
    • (四)改
    • (五)删
  • 五、关于pymysql注入问题

一、概念

如果使用之前学习的MySQL客户端来完成插入10000条数据的操作,那么这个工作量无疑是巨大的,在这个时候就可以使用pymysql,更高效。

PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,用于 Python 程序与 MySQL 数据库的交互。pymysql连接速度快,协议优化,更适宜于用来处理大批量数据,

二、数据准备

例:
--1. 创建 "京东" 数据库
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);# 创建用户表
create TABLE user(id int PRIMARY KEY AUTO_INCREMENT,user varchar(30),pwd varchar(30)
);
insert into user(user,pwd) VALUE ('root','123456');

三、安装pymysql

pycharm的客户端安装指令:
命令1: pip  install pymysql  #指令1
命令2: pip  install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple/ #指令2

下面方式也可以安装:
在这里插入图片描述

四、pymysql使用

PyMySQL中的增(INSERT)、删(DELETE)、改(UPDATE)操作与事务密切相关,以下是它们之间的关系:

基本关系

1.事务是一组操作的集合:在PyMySQL中,增删改操作通常是在事务的上下文中执行的。

2.默认自动提交:PyMySQL默认启用了自动提交(autocommit=True),每个增删改语句会立即生效;如果关闭自动提交(autocommit=False),则需要显式提交事务才能使更改永久生效。

关键点

原子性:事务内的所有增删改操作要么全部成功,要么全部失败回滚(rollback);

一致性:事务执行前后数据库保持一致性状态;

隔离性:事务间的增删改操作相互隔离;

持久性:一旦事务提交,增删改的结果将永久保存。

什么是一致性状态?
一致性状态指的是数据库中的数据满足所有预定义的业务规则和完整性约束,包括:实体完整性:主键不能为空参照完整性:外键关系必须有效用户定义的完整性:如账户余额不能为负、年龄必须大于0等业务规则数据关系正确性:如总金额=单价×数量等计算关系

事务机制确保了PyMySQL中增删改操作的可靠性和数据完整性。

(一)使用步骤

pymysql使用步骤:
1.导入模块
2.创建连接
3.创建游标
4.执行sql
5.关闭游标
6.关闭连接

(二)查询操作

# 1.导入pymysql模块
import pymysql# 2.创建连接对象
conn = pymysql.connect(host='localhost',port=3306,user='root',password='root',database='jing_dong'
)
# 3.创建游标对象
cur = conn.cursor()
# 4.执行sql
row = cur.execute('SELECT * FROM goods')
print(f'影响了{row}行')
# fetchone: 一次拿一条数据
# data1 = cur.fetchone()
# print(data1)
# fetchall: 一次拿剩下的所有的数据
data2 = cur.fetchall()
print(data2)
# 5.关闭游标
cur.close()
# 6.关闭连接
conn.close()

额外分享:关于InnoDB引擎和MyISAM引擎(方便看懂后面代码)
在这里插入图片描述

InnoDB要求显式提交不是为了增加复杂度,而是为了提供:更强大的数据完整性保障更灵活的业务逻辑控制更安全的错误恢复机制更高的并发性能

(三)增

# 1.导入pymysql模块
from pymysql import connect# 2.创建连接对象
conn = connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.创建游标对象
cur = conn.cursor()
# 4.执行sql语句
row = cur.execute("insert into goods(name,cate_name,brand_name) value ('测试','测试','测试')")
print(f'影响了{row}行')
# innoDB引擎要求必须提交,myisam引擎不支持事务(不commit也可以)
conn.commit()
# 5.关闭游标
cur.close()
# 6.关闭连接
conn.close()

(四)改

# 1.导入pymysql模块
from pymysql import connect# 2.创建连接对象
conn = connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.创建游标对象
cur = conn.cursor()
# 4.执行sql语句
row = cur.execute("update goods set price = 99999 where name='测试'")
print(f'影响了{row}行')
# innoDB引擎要求必须提交,myisam引擎不支持事务(不commit也可以)
conn.commit()
# 5.关闭游标
cur.close()
# 6.关闭连接
conn.close()

(五)删

# 1.导入pymysql模块
from pymysql import connect# 2.创建连接对象
conn = connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.创建游标对象
cur = conn.cursor()
# 4.执行sql语句
try:row = cur.execute("DELETE FROM goods WHERE name='测试'")print(f'影响了{row}行')# a = 1 / 0
except Exception as e:print(f'老弟啊,出错了呀...详情:{e}')conn.rollback()# innoDB引擎要求必须提交,myisam引擎不支持事务(不commit也可以)
conn.commit()
# 5.关闭游标
cur.close()
# 6.关闭连接
conn.close()

五、关于pymysql注入问题

首先,一个实际应用中:

例:
# 用户登录
username = input('请输入用户名:')
password = input('请输入密码:')
# 后台python代码连接数据库判断
# 1.导入pymysql模块
import pymysql
# 2.创建连接对象
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.创建游标对象
cur = conn.cursor()
# 4.执行sql语句(判断是否登录成功)
row = cur.execute(f"select * from user where user='{username}' and pwd='{password}'")
if row:print('登录成功')
else:print('登录失败')
# 5.关闭游标
cur.close()
# 6.关闭连接
conn.close()

用户可能出现下面情况(注入问题):

例:
用户录入:
用户名:随意  密码: ' or 1=1 or '
导致系统构造后的mysql语句为:select * from user where user='root' and pwd='  'or 1=1 or '  ', 无法达成原始验证目的(or与前面的and被同样识别)。

处理方法(不能太信任用户):

解决sql注入问题: sql单独定义,用%s占位,把所有参数放到列表里,把sql和参数列表传给execute,这样系统构造mysql语句将不会出错(严格的代码/数据分开)。

# 用户登录
username = input('请输入用户名:')
password = input('请输入密码:')
# 后台python代码连接数据库判断
# 1.导入pymysql模块
import pymysql
# 2.创建连接对象
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.创建游标对象
cur = conn.cursor()
# 4.执行sql语句(判断是否登录成功)
# 解决sql注入问题:  sql单独定义,用%s占位,把所有参数放到列表里,把sql和参数列表传给execute
sql = "select * from user where user=%s and pwd=%s"
parm = [username,password]
row = cur.execute(sql,parm)
if row:print('登录成功')
else:print('登录失败')
# 5.关闭游标
cur.close()
# 6.关闭连接
conn.close()

今天的分享到此为止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职坐标AIoT技能培训课程实战解析

职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心,构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路,通过分层递进的知识模块帮助学员建立系统…

MySQL 用户权限管理:从入门到精通

在当今数据驱动的时代,数据库安全已成为企业信息安全体系的核心组成部分。作为最流行的开源关系型数据库之一,MySQL 的用户权限管理系统提供了强大而灵活的访问控制机制。本文将全面解析 MySQL 用户权限管理的各个方面,帮助数据库管理员和开发…

Java常见API文档(下)

格式化的时间形式的常用模式对应关系如下: 空参构造创造simdateformate对象,默认格式 练习.按照指定格式展示 package kl002;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class Date3 {publi…

博图1200硬件组态与启保停程序编写步骤详解

一、前言 在工业自动化控制领域,西门子S7-1200 PLC因其性能稳定、编程灵活而广受欢迎。本文将详细介绍使用TIA Portal(博图)软件进行S7-1200 PLC硬件组态以及编写基本启保停程序的完整步骤,帮助初学者快速掌握这一基础而重要的技…

AutoMouser - 单次AI调用铸就高效自动化脚本

你是否厌倦了反复点点点的枯燥操作?是否希望像科幻电影那样,一句指令,万事搞定?如果告诉你,现在只需要一次AI调用,就能自动执行一整套鼠标脚本操作,你会不会觉得:自动化的时代&#…

双周报Vol.72:字段级文档注释支持、视图类型现为值类型,减少内存分配

双周报Vol.72:字段级文档注释支持、视图类型现为值类型,减少内存分配 更新目录 ..调用链末尾自动丢弃值语义变更字段级文档注释支持视图类型现为值类型,减少内存分配特效函数调用现支持样式高亮实验性支持虚拟包,接口与实现解耦 …

OceanBase 开发者大会:详解 Data × AI 战略,数据库一体化架构再升级

OceanBase 2025 开发者大会与5月17日在广州举行。这是继 4 月底 OceanBase CEO 杨冰宣布公司全面进入AI 时代后的首场技术盛会。会上,OceanBase CTO 杨传辉系统性地阐述了公司的 DataAI 战略,并发布了三大产品:PowerRAG、共享存储&#xff0c…

大小端模式和消息的加密解密

大小端模式 知识点一 什么是大小端模式 // 大端模式 // 是指数据的高字节保存在内存的低地址中 // 而数据的低字节保存在内存的高地址中 // 这样的存储模式有点儿类似于把数据当作字符串顺序处理 // 地址由小向大增加,数据从高位往低位放 …

WebRTC技术EasyRTC嵌入式音视频通信SDK助力智能电视搭建沉浸式实时音视频交互

一、方案概述​ EasyRTC是一款基于WebRTC技术的开源实时音视频通信解决方案,具备低延迟、高画质、跨平台等优势。将EasyRTC功能应用于智能电视,能够为用户带来全新的交互体验,满足智能电视在家庭娱乐、远程教育、远程办公、远程医疗等多种场…

Supermemory:让大模型拥有“长效记忆“

目录 引言:打破大语言模型的记忆瓶颈,迎接AI交互新范式 一、Supermemory 核心技术 1.1 透明代理机制 1.2 智能分段与检索系统 1.3 自动Token管理 二、易用性 三、性能与成本 四、可靠性与兼容性 五、为何选择 Supermemory? 六、对…

2025.5.17总结

周六上了一天的课,从早上9:30至下午6:30,在这个过程中,确实也收获了不少。 1.结识了更多的大佬和不同职业的精英。 一个在某科技公司做开发的主管甘阿碰,当我听到科技公司,还以为是公司里的一…

语音识别——通过PyAudio录入音频

PyAudio 是一个用于处理音频的 Python 库,它提供了录制和播放音频的功能。通过 PyAudio,可以轻松地从麦克风或其他音频输入设备录制音频,并将其保存为文件或进行进一步处理。 安装 PyAudio 在使用 PyAudio 之前,需要先安装它。可…

python打卡day30

模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 python的学习就像…

C++ —— Lambda 表达式

🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 L…

十三、面向对象底层逻辑-Dubbo序列化Serialization接口

一、引言:分布式通信的数据桥梁 在分布式服务调用中,参数的跨网络传输需要将对象转化为二进制流,这一过程直接影响系统的性能、兼容性与安全性。Dubbo通过Serialization接口构建了可扩展的序列化体系,支持多种序列化协议的无缝切…

批量剪辑 + 矩阵分发 + 数字人分身源码搭建全技术解析,支持OEM

在互联网内容生态蓬勃发展的当下,企业与创作者对内容生产与传播效率的要求日益增长。批量剪辑、矩阵分发和数字人分身技术的融合,成为提升内容创作与运营效能的关键方案。从源码层面实现三者的搭建与整合,需要深入理解各功能技术原理&#xf…

Java List 接口知识点详解

一、List 接口概述 1. 基本定义 继承关系:List 是 Java 集合框架(Collection Framework)中的一个有序队列接口,直接继承自 Collection 接口。核心特性: 有序性:元素按插入顺序存储,可通过索引…

OpenCV-去噪效果和评估指标方法

实验前言 噪音类型 opencv常见噪音类型有 高斯噪音:高斯噪音是一种随机噪音,其数值服从正态分布。图像受到高斯噪音的影响时,像素值的变化类似于白噪音,但是噪音的强度会随像素值的变化而变化。 椒盐噪音:椒盐噪音是…

永磁同步电机公式总结【一】——反电动势、磁链、转矩公式;三项、两项电压方程;坐标表换方程

一、PMSM 电机参数介绍 1.1 转子极数 转子极数 (Rotor Poles) :三相交流电机每组线圈都会产生 N、S 磁极,每个电机每相含有的永磁体磁极个数就是极数。由于磁极是成对出现的,所以电机有 2、4、6、8……极 (偶数)。 未知参数的电机&#xff…

eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点

一、eMMC 技术深度解析 1.定义与背景 eMMC(Embedded Multi Media Card)是一种专为嵌入式系统设计的非易失性存储解决方案,它将 NAND 闪存、主控芯片和接口协议封装在一个 BGA(Ball Grid Array)封装中。其核心目标是简…