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中的pprint折腾记
Jan 21 Python
Python脚本实现格式化css文件
Apr 08 Python
python从入门到精通(DAY 3)
Dec 20 Python
python 文件操作删除某行的实例
Sep 04 Python
Python实现的rsa加密算法详解
Jan 24 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
用python简单实现mysql数据同步到ElasticSearch的教程
May 30 Python
python读取LMDB中图像的方法
Jul 02 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
python Django里CSRF 对应策略详解
Aug 05 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 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获取当前url的具体方法全面解析
2013/11/26 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
python 定时修改数据库的示例代码
2018/04/08 Python
python爬虫 正则表达式解析
2019/09/28 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Python Django路径配置实现过程解析
2020/11/05 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
成教毕业生自我鉴定
2013/10/23 职场文书
师范大学音乐表演专业求职信
2013/10/23 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
关于环保的演讲稿
2014/05/10 职场文书
党员查摆剖析材料
2014/10/10 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB