Python_pymysql_与mysql交互

news/2024/4/30 3:45:35/文章来源:https://blog.csdn.net/GDYY3721/article/details/131790986

目录

基础功能

简单封装

源码等资料获取方法


基础功能

import pymysql
from pymysql.cursors import DictCursor  # 导入字典类型的游标对象# 连接数据库
db = pymysql.connect(host='192.168.3.109',      # 数据库IP地址port=3306,             # 数据库端口号user='root',           # 数据库用户名password='123456',     # 数据库用户密码db='test')             # 连接的数据库名称# cursor() 方法可以创建一个游标对象
# 如果不指定游标返回的数据,则返回的数据默认为元组类型
# cursor = db.cursor()
# 指定为dict类型游标,则返回的数据为字典类型
cursor = db.cursor(DictCursor)# execute() 方法可以执行所有的原生SQL,成功执行则结果返回数字
# 比如:创建表格,则返回0
ret = cursor.execute("CREATE TABLE testsheet (name VARCHAR(20), gender CHAR(1),age int(2))")     # 创建表格
print(F"创建表格:{ret}")# 比如:插入数据,则返回插入记录数
ret = cursor.execute("INSERT INTO testsheet (name,gender,age) VALUES('张三', '男', 22),('三二一', '女', 22)")
print(F"插入数据:{ret}")# 比如:查询数据,则返回记录数
ret = cursor.execute("select * from testsheet")
print(F"记录数:{ret}")# 比如:删除表格,则返回0
ret = cursor.execute("DROP TABLE testsheet")
print(F"删除表格:{ret}")# 使用fetchall()和fetchone()可以提取查询的数据,提取后数据删除
# fetchall() 提取所有数据,如果查询的数据为空,则返空,比如(),[];一次查询,多次提取,则返空
cursor.execute("select * from info")
ret = cursor.fetchall()
print(F"fetchall提取数据:{ret}")
ret = cursor.fetchall()
print(F"fetchall再次提取数据:{ret}")# fetchone() 提取第一条数据,如果查询的数据为空,则返回None;一次查询,多次提取,则返回提取后的第一条数据,直到提取完,则返None。
cursor.execute("select * from info")
ret = cursor.fetchone()
print(ret)
ret = cursor.fetchone()
print(ret)# 强调:使用execute()执行有参数的sql语句时,如果sql语句直接使用字符串初始化的方法存在SQL注入风险;需要使用execute(sql, 参数)的方式执行,防止SQL注入
# 比如查询ID为1的数据
id = 1
sql = "select * from info where id='%s'" % (id,)
cursor.execute(sql)
ret = cursor.fetchall()
print(F"查询ID为1的数据结果:{ret}")# 如果传入的值被恶意修改成下面的值,那么数据就存在脱库的安全问题
id = "1' or '1=1"
sql = "select * from info where id='%s'" % (id,)
cursor.execute(sql)
ret = cursor.fetchall()
print(F"SQL注入的查询结果:{ret}")# 防SQL注入的执行方式,如果使用上面的id参数,则会报SQL语句错误
sql = "select * from info where id='%s'"
try:cursor.execute(sql, (id,))ret = cursor.fetchall()
except:ret = "执行报错"
print(F"防SQL注入的查询结果:{ret}")# rollback() 回滚数据。只要没有commit,可以使用 rollback 回滚所有对数据库进行了修改的操作(增、删、改)
# db.rollback()# 提交游标的操作到数据库。
db.commit()# 关闭游标
cursor.close()
# 关闭数据库连接
db.close()

简单封装

import pymysql
from pymysql.cursors import DictCursor      # 导入游标类型对象class Mysql(object):def __init__(self, host, user, password, port, db):# 连接数据库self.database = pymysql.connect(host=host, user=user, password=password, port=port, db=db)print("连接数据库")# 获取游标对象self.cursor = self.database.cursor()  # 使用该游标返回的数据为元组类型print(self.cursor)self.cursor = self.database.cursor(DictCursor)  # 使用该游标返回的数据为字典类型print(self.cursor)def __del__(self):"""对象销毁进行资源回收"""# 关闭游标self.cursor.close()# 关闭数据库连接self.database.close()print("__del__被执行")def execute(self, query, args=None, force=None):"""执行SQL:param query: sql语句:param args: sql语句中的参数:param force: 是否跳过对sql语句"where"的检查:return:返回游标对象"""# 对query传入的sql语句校验是否包含"where",若包含,args又没传参数则抛异常。校验的目的是防SQL注入if force is None:query = query.lower()if "where" in query and args is None:raise("检查到SQL中包含条件语句,但args参数为空,存在SQL注入的风险,若仍要执行,请将参数force的值修改为True")self.cursor.execute(query, args)# 返回游标对象就可以采用 execute().fetchone()的方式获取值return self.cursordef commit(self):"""提交数据,提交失败则回滚"""try:self.database.commit()return 0except Exception as e:self.database.rollback()return -1if __name__ == '__main__':db = Mysql(host="192.168.0.58", user='root', password='123456', port=3306, db="test")_id = "1 or 1=1"code = "000036"# SQL注入执行方式sql = "select * from info WHERE id=%s or code=%s" % (_id, code)# ret = db.execute(sql).fetchall()ret = db.execute(sql, force=True).fetchall()print(ret)print(F"SQL注入获取的数据数:{len(ret)}")# 防SQL注入的执行方式sql = "select * from info where id=%s or code=%s"ret = db.execute(sql, (_id, code)).fetchall()print(ret)print(F"防SQL注入获取的数据数:{len(ret)}")print("="*50)# 更新数据_id = 1code = "000011"sql = "UPDATE `d`.`info` SET `code` = %s WHERE `id` = %s"db.execute(sql, (code, _id))ret = db.commit()if ret == 0:print("数据更新成功")else:print("数据更新失败")# 获取指定字段值_id = 1sql = "select * from info where id=%s"ret = db.execute(sql, (_id,)).fetchone()print(f"获取id为{_id}的code字段值:{ret.get('code')}")

执行结果

源码等资料获取方法

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

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

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

相关文章

如何解决PDF文件过大无法发送的问题?这几个方法轻松完成PDF压缩~

在我们日常生活中PDF文件已经成为了一种非常常见的文档格式,它具有跨平台和易于阅读的特点,因此很多人都喜欢使用它。然而,当我们需要发送一个较大的PDF文件时,很可能会遇到文件过大而无法发送的问题。那么,该怎样压缩…

基于Dubbo分布式网上售票系统

一、项目介绍 民航售票是一个高度依赖信息业的行业。但在机票销售的管理和规范这方面上存在着很多各种各样的问题。例如订票是客运行业中的一个最基本的业务,表面上看,它只是机票站业务的一个简单的部分,但是它涉及到管理与客户服务等多方面,关系到民航公司能否正常运作。…

学习系统编程No.31【多线程互斥与同步】

引言: 北京时间:2023/7/16/14:32,摆烂至今,在耍这方面,谁能比我行,哈哈哈,乐观!欠了一堆课要补,等我们把线程相关知识学完,对于系统编程方面我们搞定的就差不…

ShardingSphere分库分表实战之水平分表

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

【动态内存错误详解和C的内存分区】

常见的动态内存错误 1.动态内存错误2.经典案例分析2.1案例一2.1.1**问题分析**2.1.2**修改错误** 2.2案例二2.2.1 原因分析2.2.2 解决问题 c/c内存分布1.2 内存分区简介1.2.1 栈区(stack)1.2.2 堆区(heap)1.2.3 全局(静态)区1.2.4 常量区1.2.5 代码区 1.动态内存错误 &#xf…

面试中关于自动化测试的认识

目录 一、什么是自动化测试,自动化测试的优势是什么? 二、什么样的项目比较适合做自动化测试,什么样的不适合做自动化测试? 三、在制定自动化测试计划的时候一般要考虑哪些点? 四、编写自动化脚本时的一些规范&…

【java】JMeter进行web测试

JMeter进行web测试 1.对网页进行负载测试新建线程组添加默认 HTTP 请求属性添加cookie支持添加HTTP请求添加监听器以便于查看结果登录网站 2. 测试本地web项目3. 其他使用 URL 重写处理用户会话使用标题管理器 参考JMeter用户手册 https://jmeter.net/usermanual/build-web-te…

【C++初阶】list的模拟实现 附源码

一.list介绍 list底层是一个双向带头循环链表,这个我们以前用C语言模拟实现过,->双向带头循环链表 下面是list的文档介绍: list文档介绍 我们会根据 list 的文档来模拟实现 list 的增删查改及其它接口。 二.list模拟实现思路 既然是用C模拟…

C语言项目小游戏之俄罗斯方块

今天给大家带来一个用C语言实现的俄罗斯方块小游戏 游戏截图&#xff1a; 首先我们先创建一个名为mywindows.h的头文件。用来设置我们操作台的各种功能实现 mywindows.h #ifndef MYWINDOWS_H_INCLUDED #define MYWINDOWS_H_INCLUDED//系统调用模块 #include <windows.h&g…

【C语言】指针数组测试题(1万字长文)

江南可采莲&#xff0c;莲叶何田田。鱼戏莲叶间。鱼戏莲叶东&#xff0c;鱼戏莲叶西&#xff0c;鱼戏莲叶南&#xff0c;鱼戏莲叶北。 — 两汉汉乐府《江南》 这篇博客我们将会讲解一些习题&#xff0c;习题是有关于数组和指针的&#xff0c;数组方面的习题也能帮助我们更好的理…

mysql数字开头字符串排序

表结构 CREATE TABLE building (id bigint NOT NULL,name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 名称,full_name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 全称,PRIMARY KEY (id) USIN…

Redis 最佳实践:7 个维度 + 43 条使用规范,带你彻底玩转 Redis | 附实践清单

目录​​​​​​​ 前言 如何使用 Redis 更节省内存&#xff1f; 1) 控制 key 的长度 2) 避免存储 bigkey 3) 选择合适的数据类型 4) 把 Redis 当作缓存使用 5) 实例设置 maxmemory 淘汰策略 6) 数据压缩后写入 Redis 如何持续发挥 Redis 的高性能&#xff1f; 1) …

HDFS与MapResource笔记

客户端向NN请求上传文件 NN回应可以上传 请求上传块,返回DN 所以后面就比较慢 找最近的服务器进行 64K发到1节点,1节点立刻发给2节点,同时1节点自动开始落盘,这里,3个节点是同时落盘的. 因为缓存是在内存中,而持久化是将数据存到磁盘上. 副本节点选择: 1.安全:放不同机架 2.速…

【实战总结】SpringMVC架构升级SpringCloudAlibaba

升级目标 SpringMVCDubboZookeeper分布式架构改为Spring Cloud Alibaba微服务 技术框架:Spring Boot 2.7.2、Spring Cloud 2021.0.3 & Alibaba 2021.0.1.0 容器:Tomcat 9.0.65 JDK:1.8 配置中心:Nacos 2.0.4 消息队列:RocetMQ 4.9.3 配置中心:Apollo 11.0 缓存: Redis 4.0…

mmdet3d预处理(下)| train pipeline

mmdet3d预处理&#xff08;下&#xff09;—— train pipeline 文章目录 mmdet3d预处理&#xff08;下&#xff09;—— train pipeline基类 BaseTransformLoadPointsFromFileLoadAnnotations3D标签信息&#xff1a;源码 ObjectSample源码 ObjectNoise输入参数源码RandomFlip3D…

Loadrunner结合Fiddler实现脚本的录制

Loadrunner一直被业内认为是最好用的性能测试工具&#xff0c;行业大哥大, 但是用过Loadrunner的朋友都知道&#xff0c;工具功能的确牛&#xff0c;但实际使用过程中总会有一些困扰新手的问题&#xff0c;无法录制脚本&#xff0c; 如遇到Loadrunner不支持的IE版本、对Chrome、…

2023年 大二,我拿到了 3 家大厂 offer,为什么我要安利你去实习?

关于 2023年 大二&#xff0c;我拿到了 3 家大厂 offer 这件事 2023年&#xff0c;在大二那年寒假的时候&#xff0c;提前自学完&#xff0c;觉得自己知识储备差不多了&#xff0c;开始投递软件开发实习&#xff0c;刚开始的时候真的是屡遭打击&#xff0c;首先因为本身是双非二…

如何通过边缘智能网关实现暴雨灾害监测预警

随着台风季来临&#xff0c;暴雨灾害也进入到频发阶段&#xff0c;给村镇和城市居民都造成诸多人身和财产损失。针对南方台风季的水灾防治&#xff0c;物联网技术派上大用场&#xff0c;本篇就基于边缘智能网关的数采方案&#xff0c;简单介绍对暴雨导致的洪涝、内涝的监测和预…

2023Testing Expo| 怿星科技展品抢先看(第一弹)

8月9日-11日&#xff0c;2023汽车测试及质量监控博览会将于上海世博展览馆1号馆举行&#xff0c;本次展会将展示测试和验证技术在整车、零部件和系统开发领域中的新发展、新产品和新解决方案。怿星科技将携最新的ETH测试、智驾测试、PPS测试等方案亮相测试展&#xff0c;届时欢…

【文末送书 - 数据分析之pandas篇④】- DataFrame数据合并

向阳花花花花 - 个人主页 迄今所有人生都大写着失败&#xff0c;但并不妨碍我继续向前 Python 数据分析专栏 正在火热更新中 &#x1f525; 文章目录 一、concat二、append三、merge3.1 没有属性相同时3.2 只有一个属性相同时1.一对一合并2.一对多合并3.多对多合并 3.3 有多个…