Python_pymysql_与mysql交互

目录

基础功能

简单封装

源码等资料获取方法


基础功能

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.hqwc.cn/news/27856.html

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

相关文章

8. 自动化测试 selenium

目录 1. 什么是自动化 2. 自动化测试金字塔 2.1 单元测试 2.2 接口自动化 2.3 UI自动化 3. 什么是 selenium 4. selenium 工作原理(重点) 1. 什么是自动化 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统&#xff0…

px4上传数据waiting for bootloader

输入make px4_fmu-v6c_default upload,出现waiting for bootloader 原因,可能是启动了QGC占用了端口,把QGC关掉,重新上电,就OK了。

Visual Studio 新功能:Include 语句清理

Visual Studio 17.7 预览版 3 引入了一项新功能,用来提升开发者的生产力。我们很高兴地宣布这项新功能:Include 语句清理,这是一个帮助你维护干净代码的工具。如需使用此功能,请确保更新到最新版本的 Visual Studio 预览版。 Inc…

VMware桥接模式无法识别英特尔AX200无线网卡解决办法

1.先到英特尔网站下载最新驱动,更新网卡驱动适用于 Intel 无线网络卡的 Windows 10 和 Windows 11* Wi-Fi 驱动程序 2.到控制面板查看无线网卡属性是否有下图组件 没有的话,依次操作 安装---服务---添加---从磁盘安装----浏览--进入VMware安装目录&…

【运维小知识】(四)——linux常用命令

运维专栏:运维小知识 目录 1.🍁🍁用mv命令修改文件名 2.🍃🍃创建及删除文件夹即文件夹下所有文件 3.🍂🍂移动文件夹并重命名 4.🌿🌿复制文件 5.🍄&#x…

SCADA平台助力智能建筑管理,掌控未来建筑

前言 在现代智能建筑管理中,随着设施管理(FM)、建筑管理系统(BMS)和火灾监测等方面的需求不断增加,以及物联网系统和建筑信息模型(BIM)方法的应用,对智能建筑管理提出更…

Android 通过插桩来代理线程池

前言 在日常开发App的过程中,难免需要依赖第三方Sdk,这样就无形中增加了我们自己App的线程数,从而会导致App出现内存溢出、Cpu消耗增加等等负面影响。如果依赖的Sdk提供了线程池代理的接口还好,那样直接设置我们自定义的线程池。但…

Java 压缩多个文件为zip包(中间不生成临时文件,直接压缩为zip二进制流),以及解压zip包二进制流为文件

Java 压缩多个文件为zip包及解压zip包以及压缩多文件为zip文件流解压zip二进制流(中间不生成临时文件,直接压缩为zip二进制流,并验证解压) 1. 效果图2. 源码 这篇博客将提供俩种方法, 提前生成要压缩的多个文件&#…

招聘小程序制作:连接人才与企业

随着人才市场的竞争日益激烈,招聘小程序成为了企业寻找优秀人才和求职者找到理想工作的重要工具。通过招聘小程序,企业可以发布招聘信息、筛选简历,而求职者可以浏览职位、提交简历等。 招聘小程序的好处 精准匹配人才:招聘小程序…

js的this绑定规则以及箭头函数

目录 调用位置默认绑定隐式绑定隐式丢失 显式绑定callapplybind new绑定装箱绑定优先级this规则之外忽略显式绑定间接函数引用 箭头函数 调用位置 从字面意思上来理解,this似乎是指向自己的 然而在JavaScript中,this并不是绑定到自身的 可以看这一个例子…

经典常谈思维导图怎么制作?手把手教你制作

经典常谈思维导图怎么制作?创建思维导图可以帮助我们更好地组织和整理信息,帮助我们更好地理解和记忆信息。它可以使我们更高效地学习和工作,并帮助我们更好地表达和分享我们的想法和想法。因此,制作思维导图是一种非常有用的技能…

适合投资者的交易策略,4步找到

在外汇交易市场中,根据市场情况和个人投资目标,制定灵活的交易策略是至关重要的。Forexclub认为投资者可以通过结合多种交易策略,打造出全面、科学且适合自己的外汇交易策略。 首先,基于技术指标的交易策略是判断市场趋势和转折点…