Python使用pymysql模块操作mysql增删改查实例分析


Posted in Python onDecember 19, 2019

本文实例讲述了Python使用pymysql模块操作mysql增删改查。分享给大家供大家参考,具体如下:

# -*- coding:utf-8 -*-
import pymysql
user = input('请输入用户名:')
pwd = input('请输入密码:')
# 1.连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', db='t1', charset='utf8')
print(conn)
# 2.创建游标
cursor = conn.cursor()
#注意%s需要加引号
sql = "select * from t1.userinfo where username='%s' and pwd='%s'" %(user, pwd)
print(sql)
# 3.执行sql语句
cursor.execute(sql)
result=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
print(result)
# 关闭连接,游标和连接都要关闭
cursor.close()
conn.close()
if result:
 print('登陆成功')
else:
 print('登录失败')

下面是执行过程

请输入用户名:lisi
请输入密码:123
<pymysql.connections.Connection object at 0x000001BEFABFE240>
select * from t1.userinfo where username='lisi' and pwd='123'

登陆成功

二、execute()之sql注入

方式

#1、sql注入之:用户存在,绕过密码
lisi' -- 任意字符
#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符

请输入用户名:sdj;fja;' or 1=1 -- ;j;j;jj;jjkdsjfjsd
请输入密码:123
<pymysql.connections.Connection object at 0x000001EF2BE3E240>
select * from t1.userinfo where username='sdj;fja;' or 1=1 -- ;j;j;jj;jjkdsjfjsd' and pwd='123'

登陆成功

解决:

1采用列表的方式

# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(username,pwd)
# print(sql)
# result=cursor.execute(sql)
#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and pwd=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
result=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

2采用字典的方法

# -*- coding:utf-8 -*-
import pymysql
user = input('请输入用户名').strip()
pwd = input('请输入密码').strip()
# 连接服务端
conn = pymysql.connect(
 host='127.0.0.1',
 user='root',
 password="123",
 database='t1',
 port=3306,
 charset='utf8'
)
# -- ddadad
# 创建游标对象
cur = conn.cursor()
sql = "select * from userinfo where username = %(name)s and pwd = %(password)s"
print(sql)
# resultNum = cur.execute(sql,[user,pwd])
resultNum = cur.execute(sql,{"name":user,"password":pwd})
print(resultNum)
cur.close()
conn.close()
if resultNum:
 print('登陆成功')
else:
 print('登陆失败')

三、增、删、改:conn.commit()

commit()方法:在数据库里增、删、改的时候,必须要进行提交,否则插入的数据不生效。

基本框架

import pymysql
username = input('请输入用户名:')
pwd = input('请输入密码:')
# 1.连接
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', db='db8', charset='utf8')
# 2.创建游标
cursor = conn.cursor()
--------增删改操作----------------
#一定记得commit
conn.commit()
# 4.关闭游标
cursor.close()
# 5.关闭连接
conn.close()

增--》一组数据

sql='insert into userinfo(username,pwd) values(%s,%s)'
effect_row=cursor.execute(sql,(username,pwd)) # effect_row=1

增---》多组数据

sql='insert into userinfo(username,pwd) values(%s,%s)'
effect_row=cursor.executemany(sql,[('赵八','112'),('刘九','114'),('封十','911')]) #effect_row=3

sql='delete from userinfo where pwd like "%2"'
effect_row=cursor.execute(sql)

sql='update userinfo set username = %s where pwd="114"'
effect_row=cursor.execute(sql,'niu') #effect_row=2

 **上面的变量 effect_row=cursor.execute(...) ,返回的是成功改变的条目数字

四、查:fetchone、fetchmany、fetchall

表的内容

mysql> select * from userinfo;
+----+----------+-----+
| id | username | pwd |
+----+----------+-----+
| 1 | mjj  | 123 |
| 3 | 张三  | 110 |
| 4 | 李四  | 119 |
+----+----------+-----+
3 rows in set (0.00 sec)

固定格式

import pymysql
# 1.连接
conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
# 2.创建游标
cursor = conn.cursor()
sql = 'select * from userinfo'
cursor.execute(sql)
------------执行的查询--------------
# 4.关闭游标
cursor.close()
# 5.关闭连接
conn.close()

fetchone查看一条符合条件的数据,可以连续使用,查询的是上一个fetchone的后面一条

# 查询第一行的数据
row = cursor.fetchone()
print(row) # (1, 'mjj', '123')
# 查询第二行数据
row = cursor.fetchone()
print(row) # (3, '张三', '110')

fetchall():查询所有符合条件的数据

# 获取所有的数据
rows = cursor.fetchall()
print(rows)
#运行结果
((1, 'mjj', '123'), (3, '张三', '110'), (4, '李四', '119')) 取到的返回值是元组

fetchmany:获取指定的条数数据

row=cursor.fetchmany(3)
print(row)

cursor.scroll(num,mode='relative|absolute')  当mode=absolute时,num不能小于0

cursor.scroll(1,mode='relative') # 相对当前位置移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动
# 查询第一行的数据
row = cursor.fetchone()
print(row) # (1, 'mjj', '123')
# 查询第二行数据
row = cursor.fetchone() # (3, '张三', '110')
print(row)
cursor.scroll(-1,mode='relative') #设置之后,光标相对于当前位置往前移动了一行,所以打印的结果为第二行的数据
row = cursor.fetchone()
print(row)
cursor.scroll(0,mode='absolute') #设置之后,光标相对于首行没有任何变化,所以打印的结果为第一行数据
row = cursor.fetchone()
print(row)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
使用Python编写简单的画图板程序的示例教程
Dec 08 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
python实现TF-IDF算法解析
Jan 02 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
Python Gitlab Api 使用方法
Aug 28 Python
python是否适合网页编程详解
Oct 04 Python
python实现广度优先搜索过程解析
Oct 19 Python
python实现两个字典合并,两个list合并
Dec 02 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
Python调用飞书发送消息的示例
Nov 10 Python
python 普通克里金(Kriging)法的实现
Dec 19 #Python
Python函数参数类型及排序原理总结
Dec 19 #Python
python中with语句结合上下文管理器操作详解
Dec 19 #Python
Django中密码的加密、验密、解密操作
Dec 19 #Python
利用OpenCV和Python实现查找图片差异
Dec 19 #Python
Python文本处理简单易懂方法解析
Dec 19 #Python
python类中super() 的使用解析
Dec 19 #Python
You might like
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
Python实现数据库编程方法详解
2015/06/09 Python
全面理解Python中self的用法
2016/06/04 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
python mysql断开重连的实现方法
2019/07/26 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
python 实现矩阵按对角线打印
2019/11/29 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
建筑工程专业学生的自我评价
2013/12/25 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
《月迹》教学反思
2014/02/19 职场文书
安全宣传标语口号
2014/06/06 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
美术教师个人工作总结
2015/02/06 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS