Python中pymysql 模块的使用详解


Posted in Python onAugust 12, 2019

pymysql 模块的使用

一、pymysql的下载和使用

(1)pymysql模块的下载

pip3 install pymysql

(2)pymysql的使用

# 实现:使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中)
import pymysql
user = input('请输入用户名:')
pwd = input('请输入密码:')

# 1.连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db8', charset='utf8')

# 2.创建游标
cursor = conn.cursor()

#注意%s需要加引号
sql = "select * from 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('登录失败')

二、execute()之sql注入

最后那一个空格,在一条sql语句中如果遇到select * from userinfo where username='mjj' -- asadasdas' and pwd='' 则--之后的条件被注释掉了(注意--后面还有一个空格)

#1、sql注入之:用户存在,绕过密码

mjj' -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码

xxx' or 1=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 password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
result=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

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

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

import pymysql
username = input('请输入用户名:')
pwd = input('请输入密码:')

# 1.连接
conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')

# 2.创建游标
cursor = conn.cursor()

# 操作
# 增
# sql = "insert into userinfo(username,pwd) values (%s,%s)"

# effect_row = cursor.execute(sql,(username,pwd))
#同时插入多条数据
#cursor.executemany(sql,[('李四','110'),('王五','119')]) 

# print(effect_row)#

# 改
# sql = "update userinfo set username = %s where id = 2"
# effect_row = cursor.execute(sql,username)
# print(effect_row)

# 删
sql = "delete from userinfo where id = 2"
effect_row = cursor.execute(sql)
print(effect_row)

#一定记得commit
conn.commit()

# 4.关闭游标
cursor.close()

# 5.关闭连接
conn.close()

四、查:fetchone、fetchmany、fetchall

fetchone():获取下一行数据,第一次为首行;

fetchall():获取所有行数据源

fetchmany(4):获取4行数据

查看一下表内容:

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

使用fetchone():

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)

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

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

# 4.关闭游标
cursor.close()

# 5.关闭连接
conn.close()

使用fetchall():

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)

# 获取所有的数据
rows = cursor.fetchall()
print(rows)

# 4.关闭游标
cursor.close()

# 5.关闭连接
conn.close()

#运行结果
((1, 'mjj', '123'), (3, '张三', '110'), (4, '李四', '119'))

默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  #在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor

在fetchone示例中,在获取行数据的时候,可以理解开始的时候,有一个行指针指着第一行的上方,获取一行,它就向下移动一行,所以当行指针到最后一行的时候,就不能再获取到行的内容,所以我们可以使用如下方法来移动行指针:

cursor.scroll(1,mode='relative')  # 相对当前位置移动

cursor.scroll(2,mode='absolute') # 相对绝对位置移动

第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动

# 1.Python实现用户登录
# 2.Mysql保存数据

import pymysql

# 1.连接
conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')

# 2.创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

sql = 'select * from userinfo'
cursor.execute(sql)

# 查询第一行的数据
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)

# 4.关闭游标
cursor.close()

# 5.关闭连接
conn.close()

#结果如下

{'id': 1, 'username': 'mjj', 'pwd': '123'}
{'id': 3, 'username': '张三', 'pwd': '110'}
{'id': 3, 'username': '张三', 'pwd': '110'}
{'id': 1, 'username': 'mjj', 'pwd': '123'}

fetchmany():

import pymysql

# 1.连接
conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')


# 2.创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

sql = 'select * from userinfo'
cursor.execute(sql)

# 获取2条数据
rows = cursor.fetchmany(2)
print(rows)

# 4.关闭游标

# rows = cursor.fetchall()
# print(rows)
cursor.close()

# 5.关闭连接
conn.close()

#结果如下:
[{'id': 1, 'username': 'mjj', 'pwd': '123'}, {'id': 3, 'username': '张三', 'pwd': '110'}]
Python 相关文章推荐
python基础教程之popen函数操作其它程序的输入和输出示例
Feb 10 Python
Python程序设计入门(3)数组的使用
Jun 16 Python
深入理解Python中的super()方法
Nov 20 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
Python实现Dijkstra算法
Oct 17 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 Python
python解析json数据
Apr 29 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 #Python
对Django 中request.get和request.post的区别详解
Aug 12 #Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 #Python
Python简易版停车管理系统
Aug 12 #Python
Python代码实现http/https代理服务器的脚本
Aug 12 #Python
Django admin model 汉化显示文字的实现方法
Aug 12 #Python
Python简易版图书管理系统
Aug 12 #Python
You might like
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
php递归函数怎么用才有效
2018/02/24 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
js tab 选项卡
2009/04/26 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
异步加载script的代码
2011/01/12 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
vue写一个组件
2018/04/09 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
python 图片验证码代码
2008/12/07 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
Kenneth Cole官网:纽约时尚优雅品牌
2016/11/14 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
AOP的定义以及作用
2013/09/08 面试题
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
本科生求职简历的自我评价
2013/10/21 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
社区工作者先进事迹
2014/01/18 职场文书
学年末自我鉴定
2014/01/21 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
挂职自我鉴定
2014/02/26 职场文书
高中家长寄语
2014/04/02 职场文书
妇联主席先进事迹
2014/05/18 职场文书
婚前协议书标准版
2014/10/19 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python
js前端图片加载异常兜底方案
2022/06/21 Javascript