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代码来绘制彭罗斯点阵的教程
Apr 03 Python
django使用html模板减少代码代码解析
Dec 12 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
详解python3中的真值测试
Aug 13 Python
浅述python2与python3的简单区别
Sep 19 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
详解KMP算法以及python如何实现
Sep 18 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 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
php 求质素(素数) 的实现代码
2011/04/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
收集的10个免费的jQuery相册
2011/02/26 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
postman传递当前时间戳实例详解
2019/09/14 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
机关道德讲堂实施方案
2014/03/15 职场文书
校园文化标语
2014/06/18 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
毕业生入职感言
2015/07/31 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书