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

2.什么是 PyMySQL?
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中则使用 mysqldb。
PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。
二:PyMySQL 安装
1.方法一:
1.命令行输入(下载模块 pymysql)
pip3 install pymysql

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)

三: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)

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)

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

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)
相对移动

绝对移动

五: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('用户名或密码错误')

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

3.漏洞2

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

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('用户名或密码错误')


七: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())

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

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

4.删除语句能够执行,但是并没有影响数据
res = cursor.execute(sql4)
print(res)

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()

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()

八:executemany()同时插入多个数据
1.同时插入多个数据
# 同时插入多个数据
cursor.executemany(sql2,[('jason1',1),('jason2',2),('jason3',3)])
python操作MySQL数据库连接(pymysql)的更多相关文章
- Python操作MySQL:pymysql和SQLAlchemy
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- python成长之路【第十三篇】:Python操作MySQL之pymysql
对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎 ...
- python操作MySQL数据库连接
目录 一:python操作MySQL 1.python如何操作MySQL? 2.什么是 PyMySQL? 二:PyMySQL 安装 1.方法一: 2.方法二: 三:pyMySQL模块基本使用 1.py ...
- python操作mysql之pymysql
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11.mys ...
- Python操作MySQL -即pymysql/SQLAlchemy用法
本节介绍Python对于MySQL的一些操作用法 模块1:pymysql(等同于MySQLdb) 说明:pymysql与MySQLdb模块的使用基本相同,学会pymysql,使用MySQLdb也就不是 ...
- Python自动化运维之18、Python操作 MySQL、pymysql、SQLAchemy
一.MySQL 1.概述 什么是数据库 ? 答:数据的仓库,和Excel表中的行和列是差不多的,只是有各种约束和不同数据类型的表格 什么是 MySQL.Oracle.SQLite.Access.MS ...
- python操作mysql(pymysql + sqlalchemy)
pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行sql #!/usr/bi ...
- 用Python操作MySQL(pymysql)
用python来操作MySQL,首先需要安装PyMySQL库(pip install pymysql). 连接MySQL: import pymysql connect=pymysql.connect ...
- python操作MySQL之pymysql模块
import pymysql#pip install pymysql db=pymysql.connect(','day040') cursor=db.cursor() #创建游标 book_list ...
- Python操作MySQL:pymysql模块
连接MySQL有两个模块:mysqldb和pymysql,第一个在Python3.x上不能用,所以我们学pymysql import pymysql # 创建连接 conn = pymysql.con ...
随机推荐
- SpringBoot项目的CI配置 # 安全变量
运行GitLab Runner容器 参考Run GitLab Runner in a container - Docker image installation and configuration 执 ...
- GitLab 之 Git LFS 大文件存储的配置
转载自:https://cloud.tencent.com/developer/article/1010589 1.Git LFS 介绍 Git 大文件存储(Large File Storage,简称 ...
- img和div之间有间隙的原因及解决方法
div 中 存在 img标签,由于img标签的 display:inline-block 属性. #####display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是 ...
- 2022.2.26A组总结&反思
今天的发挥比较奇妙.. T1:一眼dp+高斯消元,但是感觉细节比较多,然后先去做了T2,写完后回来推了一下就做出来了.比较裸,但是细节确实多,但是很可惜的一点是最后提交的代码没有判不合法,到手的100 ...
- Linux安装oracle 12C
安装虚拟系统CentOS6.5,分配给至少1G的内存,其他条件适当高些,具体参考官方文档 环境准备 vim /etc/profileexport JAVA_HOME=/opt/jdk1.7.0_79e ...
- 1.RabbitMQ系列之服务启动
1. docker方式启动MQ # latest RabbitMQ 3.10 docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:156 ...
- iframe的简单使用
看人家写的真的是摸不着头脑.自己写.还是清楚 局部数据的刷新:可以使用ajax.这里只是简单的演示 只作:例子使用.简单演示页面跳转 a标签中target属性和iframe中的name对应.相当于将该 ...
- go channel原理及使用场景
转载自:go channel原理及使用场景 源码解析 type hchan struct { qcount uint // Channel 中的元素个数 dataqsiz uint // Channe ...
- 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索
前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...
- ES6 学习笔记(四)基本类型Number
1.数值 1.1 .JavaScript数值的特点 不区分整数值和浮点数值. 所有数值均用浮点数值表示. 采用IEEE-754标准定义的64位浮点数格式表示. 整数在实际操作时(如数组索引),则是基于 ...