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中文编码那些事
Jun 25 Python
为Python程序添加图形化界面的教程
Apr 29 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
用Python解决计数原理问题的方法
Aug 04 Python
python基础练习之几个简单的游戏
Nov 10 Python
K-近邻算法的python实现代码分享
Dec 09 Python
python实现手机通讯录搜索功能
Feb 22 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
Python手动或自动协程操作方法解析
Jun 22 Python
Pycharm打开已有项目配置python环境的方法
Jul 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+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
JavaScript库 开发规则
2009/01/31 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
python3+PyQt5泛型委托详解
2018/04/24 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
CSS3实现时间轴效果
2016/07/11 HTML / CSS
惠普新加坡官方商店:HP Singapore
2020/04/17 全球购物
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
如何写求职信
2014/05/24 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
2016年学校招生广告语
2016/01/28 职场文书
golang为什么要统一错误处理
2022/04/03 Golang