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

一:python操作MySQL

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

image

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

二:PyMySQL 安装

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

image

2.方法二:
copy
切换下载的源(仓库) pip3 install pymysql -i 源地址 下载第三方模块的方式

三:pyMySQL模块基本使用

1.pyMySQL模块基本使用
copy
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主要方法
copy
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.内容解析:
copy
1.execute返回值是执行SQL语句之后受影响的行数 2.fetchall()获取所有的结果 fetchone()获取结果集第一个结果 fetchmany()括号内可以指定获取几个结果集

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

1.验证光标的存在
copy
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异常返回结果原因
copy
解析: 上述方法对数据的获取也存在光标的概念 fetchall()获取所有的结果

image

3.解决光标移动问题
4.相对移动(相对当前位置移动)
copy
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.验证注入问题存在
copy
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

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

image

3.漏洞2

image

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

image

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

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

1.execute方法
copy
execute方法,自动将 用户名和密码放在对应的%s内,并且放之前会自动对用户名和密码做特殊符号的校验,确保安全性。
2.解决注入问题
copy
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.二次确认作用
copy
二次确认作用: 针对增删改操作 需要二次确认才可生效
2.验证不使用二次确认情况
copy
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.查询表内数据 无影响
copy
cursor.execute(sql1) print(cursor.fetchall())

image

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

image

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

image

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

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

image

5.总结:
copy
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.不能实现增删改原因
copy
因为,该四项操作重要程度不一样,增删改查的级别不一样,查的级别是最低的,所有可以操作,但是,增删改的级别最高的,pymysq没有权限去操作,需要使用到二次确认才能进行增删改操作。 '''针对增删改操作 需要二次确认才可生效 '''
7.conn.commit()二次确认
copy
二次确认关键字: commit() 作用: 针对增删改操作 需要二次确认才可生效
8.验证二次确认(手动测试)
copy
'''针对增删改操作 需要二次确认才可生效''' # 1.插入数据 cursor.execute(sql2,('tony',123)) # 二次确认 conn.commit() # 2.修改数据 cursor.execute(sql3) # 二次确认 conn.commit() # 3.删除数据 cursor.execute(sql4) # 二次确认 conn.commit()

image

9.解决手动操作二次确认(自动化二次确认)
copy
自动二次确认: autocommmit=True # 涉及到增删改查 自动二次确认
copy
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.同时插入多个数据
copy
# 同时插入多个数据 cursor.executemany(sql2,[('jason1',1),('jason2',2),('jason3',3)])
posted @   AlexEvans  阅读(2249)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
点击右上角即可分享
微信分享提示
🚀