python操作MySQL数据库连接(pymysql)

博客 动态
0 247
优雅殿下
优雅殿下 2022-01-30 00:54:41
悬赏:0 积分 收藏

python操作MySQL数据库连接(pymysql)

目录
  • 一:python操作MySQL
    • 1.python如何操作MySQL?
    • 2.什么是 PyMySQL?
  • 二:PyMySQL 安装
    • 1.方法一:
    • 2.方法二:
  • 三:pyMySQL模块基本使用
    • 1.pyMySQL模块基本使用
  • 三:pymysql主要方法
    • 1.pymysql主要方法
    • 2.内容解析:
  • 四:fetchall对数据存在光标的概念
    • 1.验证光标的存在
    • 2.fetchone异常返回结果原因
    • 3.解决光标移动问题
    • 4.相对移动(相对当前位置移动)
  • 五:SQL注入问题
    • 1.验证注入问题存在
    • 2.漏洞1
    • 3.漏洞2
    • 4.综合以上漏洞
    • 5.造成sql语句漏洞的原因(sql注入问题)
  • 六:execute方法(解决sql注入问题)
    • 1.execute方法
    • 2.解决注入问题
  • 七:conn.commit()二次确认
    • 1.二次确认作用
    • 2.验证不使用二次确认情况
    • 3.查询表内数据 无影响
    • 2.插入语句能够执行 但是并没有影响数据
    • 3.更新语句能够执行,但是并没有影响表的数据
  • 4.删除语句能够执行,但是并没有影响数据
    • 5.总结:
    • 6.不能实现增删改原因
    • 7.conn.commit()二次确认
    • 8.验证二次确认(手动测试)
    • 9.解决手动操作二次确认(自动化二次确认)
  • 八:executemany()同时插入多个数据
    • 1.同时插入多个数据

一:python操作MySQL

1.python如何操作MySQL?
为了使python连接上数据库,你需要一个驱动,这个驱动是用于与数据库交互的库。PyMySQL : 这是一个使Python连接到MySQL的库,它是一个纯Python库(文件夹)。PyMySQL 是一个纯 Python 实现的 MySQL 客户端操作库,支持事务、存取过程、批量执行,实现增删改查等。

image

2.什么是 PyMySQL?
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中则使用 mysqldb。PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

二:PyMySQL 安装

1.方法一:
1.命令行输入(下载模块 pymysql)pip3 install pymysql

image

2.方法二:
切换下载的源(仓库)pip3 install pymysql -i 源地址下载第三方模块的方式
  • 下载模块与切换源详细教程:https://www.cnblogs.com/goOJBK/p/15621209.html

三:pyMySQL模块基本使用

1.pyMySQL模块基本使用
import pymysql# 创建链接conn = pymysql.connect(  # 赋值给 conn连接对象    host='127.0.0.1',  # 本地回环地址    port=3306,  # 默认端口    user='root',  # 用户名    password='123',  # 密码    database='db_01',  # 连接数据库名称    charset='utf8'  # 编码 不能写utf-8)# 生成一个游标对象(相当于cmd打开mysql中的 mysql>)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典# 定义SQL语句sql = 'select * from egg'# 执行SQL语句cursor.execute(sql)# 获取返回结果res = cursor.fetchall()print(res)

image

三:pymysql主要方法

1.pymysql主要方法
import pymysql# 创建链接conn = pymysql.connect(  # 赋值给 conn连接对象    host='127.0.0.1',  # 本地回环地址    port=3306,  # 默认端口    user='root',  # 用户名    password='123',  # 密码    database='db_01',  # 连接数据库名称    charset='utf8'  # 编码 不能写utf-8)# 生成一个游标对象(相当于cmd打开mysql中的 mysql>)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典# 定义SQL语句sql = 'select * from egg'# 执行SQL语句ret = cursor.execute(sql)print(ret)  # 返回值是执行SQL语句之后受影响的行数# 获取返回结果# res = cursor.fetchall()  # 列表套字典# res = cursor.fetchone()  # 数据字典# res = cursor.fetchmany(3)  # 列表套字典print(res)

image

2.内容解析:
1.execute返回值是执行SQL语句之后受影响的行数2.fetchall()获取所有的结果fetchone()获取结果集第一个结果fetchmany()括号内可以指定获取几个结果集

四:fetchall对数据存在光标的概念

1.验证光标的存在
import pymysql# 创建链接conn = pymysql.connect(  # 赋值给 conn连接对象    host='127.0.0.1',  # 本地回环地址    port=3306,  # 默认端口    user='root',  # 用户名    password='123',  # 密码    database='db_01',  # 连接数据库名称    charset='utf8'  # 编码 不能写utf-8)# 生成一个游标对象(相当于cmd打开mysql中的 mysql>)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典# 定义SQL语句sql = 'select * from egg'# 执行SQL语句ret = cursor.execute(sql)print(ret)  # 返回值是执行SQL语句之后受影响的行数# 获取返回结果res = cursor.fetchall()res1 = cursor.fetchall()print(res)print(res1)

image

2.fetchone异常返回结果原因
解析:	上述方法对数据的获取也存在光标的概念fetchall()获取所有的结果

image

3.解决光标移动问题
4.相对移动(相对当前位置移动)
import pymysql# 创建链接conn = pymysql.connect(  # 赋值给 conn连接对象    host='127.0.0.1',  # 本地回环地址    port=3306,  # 默认端口    user='root',  # 用户名    password='123',  # 密码    database='db_01',  # 连接数据库名称    charset='utf8'  # 编码 不能写utf-8)# 生成一个游标对象(相当于cmd打开mysql中的 mysql>)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典# 定义SQL语句sql = 'select * from egg'# 执行SQL语句ret = cursor.execute(sql)print(ret)  # 返回值是执行SQL语句之后受影响的行数# 获取返回结果res = cursor.fetchone()  # 获取结果集的第一个结果# cursor.scroll(1, 'relative')  # 相对当前位置移动(相对移动)# cursor.scroll(0, 'absolute')  # 相对数据开头位置移动(绝对移动)res1 = cursor.fetchall()  # 获取所有结果print(res)print(res1)

相对移动
image
绝对移动
image

五:SQL注入问题

1.验证注入问题存在
import pymysql# 创建链接conn = pymysql.connect(    host='127.0.0.1',    port=3306,    user='root',    password='123',    database='db_01',    charset='utf8')# 生成一个游标对象cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典# 获取用户名和密码username = input('username>>>:').strip()password = input('password>>>:').strip()# 构造SQL语句sql = "select * from egg where name='%s' and password='%s'"%(username,password)print(sql)# 执行sql语句cursor.execute(sql)# 获取所有返回结果res = cursor.fetchall()# if判断if res:    print(res)    print('登录成功')else:    print('用户名或密码错误')

image

目前的pymysq代码用户登录是否安全了?让我们进行测试pymysql代码(安全性)
2.漏洞1

image

3.漏洞2

image

4.综合以上漏洞
1.用户名不正确 不需要密码也能登录2.用户名和密码都不需要也能登录

image

5.造成sql语句漏洞的原因(sql注入问题)
SQL注入问题的产生	就是通过一线特殊符号的组合 达到某些特定的效果从而避免常规的逻辑SQL注入问题如何解决    execute方法自动帮你解决

六:execute方法(解决sql注入问题)

1.execute方法
execute方法,自动将 用户名和密码放在对应的%s内,并且放之前会自动对用户名和密码做特殊符号的校验,确保安全性。
2.解决注入问题
import pymysql# 创建链接conn = pymysql.connect(    host='127.0.0.1',    port=3306,    user='root',    password='123',    database='db_01',    charset='utf8')# 生成一个游标对象cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典登录功能1.获取用户名和密码2.基于用户名和密码直接精准查找username = input('username>>>:').strip()password = input('password>>>:').strip()# 构造SQL语句sql = "select * from egg where name=%s and password=%s"  # 针对核心数据 不要自己拼接 交由execute方法帮你筛选再拼接print(sql)# 执行sql语句cursor.execute(sql,(username, password))# 获取所有返回结果res = cursor.fetchall()# if判断if res:    print(res)    print('登录成功')else:    print('用户名或密码错误')

image
image

七:conn.commit()二次确认

1.二次确认作用
二次确认作用:针对增删改操作 需要二次确认才可生效
2.验证不使用二次确认情况
import pymysql# 创建链接conn = pymysql.connect(    host='127.0.0.1',    port=3306,    user='root',    password='123',    database='db_01',    charset='utf8')# 生成一个游标对象cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典sql1 = 'select * from egg'  # 查询表内数据sql2 = 'insert into egg(name,password) values(%s,%s)'  # 插入数据sql3 = 'update egg set name=jasonNB where id=1'  # 修改数据sql4 = 'delete from egg where id=2'  # 删除数据
3.查询表内数据 无影响
cursor.execute(sql1)print(cursor.fetchall())

image

2.插入语句能够执行 但是并没有影响数据
cursor.execute(sql2,('objk',123))

image

3.更新语句能够执行,但是并没有影响表的数据
res = cursor.execute(sql3)print(res)

image

4.删除语句能够执行,但是并没有影响数据

res = cursor.execute(sql4)print(res)

image

5.总结:
1.查询语句可以正常执行并获取结果cursor.execute(sql1)2.插入语句能够执行 但是并没有影响表数据cursor.execute(sql2,('jackson',666))3.更新语句能够执行 但是并没有影响表数据res = cursor.execute(sql3)print(res)4.删除语句能够执行 但是并没有影响表数据res = cursor.execute(sql4)print(res)
6.不能实现增删改原因
因为,该四项操作重要程度不一样,增删改查的级别不一样,查的级别是最低的,所有可以操作,但是,增删改的级别最高的,pymysq没有权限去操作,需要使用到二次确认才能进行增删改操作。'''针对增删改操作 需要二次确认才可生效 '''
7.conn.commit()二次确认
二次确认关键字:commit()作用:	针对增删改操作 需要二次确认才可生效
8.验证二次确认(手动测试)
'''针对增删改操作 需要二次确认才可生效'''# 1.插入数据cursor.execute(sql2,('tony',123))# 二次确认conn.commit()# 2.修改数据cursor.execute(sql3)# 二次确认conn.commit()# 3.删除数据cursor.execute(sql4)# 二次确认conn.commit()

image

9.解决手动操作二次确认(自动化二次确认)
自动二次确认:autocommmit=True  # 涉及到增删改查 自动二次确认
import pymysql# 创建链接conn = pymysql.connect(    host='127.0.0.1',    port=3306,    user='root',    password='123',    database='db_01',    charset='utf8',    autocommit=True  # 涉及到增删改 自动二次确认)# 生成一个游标对象cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典sql1 = 'select * from egg'sql2 = 'insert into egg(name,password) values(%s,%s)'sql3 = 'update egg set name="jaonNB" where id=2'sql4 = 'delete from egg where id=1''''针对增删改操作 需要二次确认才可生效'''# 1.插入数据cursor.execute(sql2,('laike',123))# 2.修改数据cursor.execute(sql3)# 3.删除数据cursor.execute(sql4)主动关闭链接 释放资源conn.close()

image

八:executemany()同时插入多个数据

1.同时插入多个数据
# 同时插入多个数据cursor.executemany(sql2,[('jason1',1),('jason2',2),('jason3',3)])
posted @ 2022-01-30 00:02 [oJbK] 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员