Python_pymysql_与mysql交互

news2024/10/6 14:23:53

目录

基础功能

简单封装

源码等资料获取方法


基础功能

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.cursor

    def commit(self):
        """提交数据,提交失败则回滚"""
        try:
            self.database.commit()
            return 0
        except Exception as e:
            self.database.rollback()
            return -1


if __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 = 1
    code = "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 = 1
    sql = "select * from info where id=%s"
    ret = db.execute(sql, (_id,)).fetchone()
    print(f"获取id为{_id}的code字段值:{ret.get('code')}")

执行结果

源码等资料获取方法

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

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

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

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

相关文章

Qchart学习

目录 Qchart简介 QChartView 简介 QAbstractAxis 简介 QAbstractSeries 简介 Qchart Public Types Properties属性 Public Functions QAbstractSeries Public Types Properties Public Functions Signals信号 QAbstractAxis Properties Public Functions 主题设…

全面了解ESP-01SWiFi模块

ESP-01S是一款基于ESP8266芯片的WiFi模块,它提供了低成本、低功耗和高度集成的解决方案,适用于物联网和嵌入式应用。本文将介绍ESP-01S模块的功能和特点,并提供一个简单的WiFi控制示例。 目录 ESP-01S模块管脚功能: ESP-01S特点…

字符串列表分类求平均值

给定一字符串列表数据,按颜色分类计算价格平均值并写入列表。 (本笔记适合对python字符串和列表基本烂熟的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程…

【C++修炼之路】模板初阶

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录 一、泛型编程二、函数模板1、概念2、格式3、函数模板实例化① 隐式② 显式 4、特性 五、类模板六、模板使内置类型"升级&q…

无人驾驶中识别颜色并跟踪的优化(加入PID算法控制)

我们了解到无人驾驶是如何去识别颜色的,以及无人车能够跟随颜色目标的演示。回到现实中我们发现,无人车的速度控制是很关键的,这个涉及到安全问题,比如等待红绿灯时,该减速或加速超车等这样很常见的情形,在…

论文笔记--OpenPrompt: An Open-source Framework for Prompt-learning

论文笔记--OpenPrompt: An Open-source Framework for Prompt-learning 1. 文章简介2. 文章概括3 文章重点技术4. 文章亮点5. 原文传送门 1. 文章简介 标题:OpenPrompt: An Open-source Framework for Prompt-learning作者:Ning Ding, Shengding Hu, We…

基于Java+SpringBoot+vue前后端分离在线视频教育平台设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Leecode316: 去除重复字母

下面这里使用有序map——TreeMap来实现Map接口,但是相对顺序是不能改变的!这样会使得后面的跑到前面去,所以有问题 最简单的思想肯定是暴力思想,就是从前往后寻找,一旦遇到存在的情况就. 重点在于明确两点&#xff1a…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 五)

Styles装饰器:定义组件重用样式 如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,我们推出了可以提炼公共样式进行复用的装饰器St…

【LLM】self-instruct 构建指令微调数据集

文章目录 一、self-instruct流程二、具体过程1. 指令生成2. 分类任务识别3. 实例生成4. 过滤和后处理 三、其他部分1. 验证数据质量2. GPT3SELF-INSTRUCT生成数据的词性分析3. Rouge-L指标 Reference 一、self-instruct流程 四部曲:指令生成;分类任务识别…

Oracle 的视图

Oracle 的视图 源数据: -- Create table create table STU_INFO (id NUMBER not null,name VARCHAR2(8),score NUMBER(4,1),class VARCHAR2(2) ) tablespace STUDENTpctfree 10initrans 1maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlim…

最多变的混合模式-实色混合HardMix

最多变的混合模式-实色混合HardMix 之前写过一篇介绍27种图层混合模式的非常详细,如果你想完全了解底层的原理,这篇文章不会让你失望。 PS图层混合模式超详细解答-图层混合模式的原理 - 王先生的副业的文章 - 知乎 https://zhuanlan.zhihu.com/p/64396…

从小白到大神之路之学习运维第63天--------zabbix企业级监控(概述、单台服务器监控本身安装部署)

第三阶段基础 时 间:2023年7月18日 参加人:全班人员 内 容: zabbix企业级监控 目录 一、Zabbix概述 (一)Zabbix简介 (二)Zabbix运行条件: (三)Zab…

深入解析 YAML 配置文件:从语法到最佳实践

一、认识YAML YAML(YAML Aint Markup Language)是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法,以易于阅读和编写的方式表示数据结构。YAML广泛应用于配置文件…

探索开源图片编辑工具:定制化编辑,激发想象

图片编辑是现代生活中广泛使用的技术,它不仅能够改善照片和图像的质量,还能创造出令人赞叹的视觉效果。随着开源文化的兴起,越来越多的开源工具涌现出来,为我们提供了实用且灵活的图片编辑功能。这些开源工具的出现为个人、设计师…

想用vivo手机设置一个5天后提醒我的闹铃,怎么设置?

在生活和工作中有很多待办事项,都不是需要当前立刻就去完成的,而且需要我们提前记住,并且在未来的某个指定日期去完成,例如两天后提交项目报告、下周五的重要会议、考试报名时间等。如果担心自己忘记这些待办事项,应该…

android APP外包开发的三种方式

开发android APP有三种方式,分别是原生开发、混合开发和无代码开发,原生开发对开发者有一定要求,但用户体验好;混合开发是使用H5开发,对开发者要求相对较低;而无代码开发则是通过操作界面搭建APP&#xff0…

openGauss学习笔记-13 openGauss 简单数据管理-DELETE语句

文章目录 openGauss学习笔记-13 openGauss 简单数据管理-DELETE语句13.1 语法格式13.2 参数说明13.3 示例 openGauss学习笔记-13 openGauss 简单数据管理-DELETE语句 DELETE语句可以从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行&…

传输层协议—网络

文章目录 1.TCP1.1TCP协议段格式1.2可靠机制1.2.1确认应答机制1.2.2超时重传机制1.2.3连接管理机制1.2.4流量控制机制1.2.5拥塞控制机制 1.3效率机制1.3.1滑动窗口机制1.3.2延迟应答机制1.3.3捎带应答机制 1.4粘包问题(tcp问题,应用层的数据包&#xff0…

JMeter 性能测试实例分析

一、性能测试分类: 1、基准测试 2、并发测试 3、负载测试 4、压力测试 1、基准测试: 也是单用户测试,测试环境确定以后,对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标,为多用户…