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在不同目录下导入模块的实现方法
Oct 27 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
Python实现定时精度可调节的定时器
Apr 15 Python
CentOS7下python3.7.0安装教程
Jul 30 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
Python实现的删除重复文件或图片功能示例【去重】
Apr 23 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
python抽象基类用法实例分析
2015/06/04 Python
python绘制双柱形图代码实例
2017/12/14 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
python实现人民币大写转换
2018/06/20 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
使用python实现对元素的长截图功能
2019/11/14 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
opencv+python实现均值滤波
2020/02/19 Python
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
监理员的岗位职责
2013/11/13 职场文书
回门宴答谢词
2014/01/13 职场文书
高一政治教学反思
2014/01/28 职场文书
英语教师求职信
2014/06/16 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python