mysql 更新(九) pymysql模块的使用
本节重点:
- pymysql的下载和使用
- execute()之sql注入
- 增、删、改:conn.commit()
- 查:fetchone、fetchmany、fetchall
一、pymysql的下载和使用
之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢?这就用到了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'}]

核心代码 哈哈哈 自己看
- import pymysql
- #开启 连接数据库conn=pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='', db='pc')
- #存入数据库cursor=conn.cursor()#创建游标对象 ,用游标对象创建sq语句sql='insert into pc.woshishui values (NULL ,"网","三")' #处理自增字段 直接把id设置为NULL
- print(sql)cursor.execute(sql)
- conn.commit()
- #关闭数据库cursor.close()conn.close()
mysql 更新(九) pymysql模块的使用的更多相关文章
- Mysql(九):Python连接MySQL数据库之pymysql模块使用
Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服 ...
- MySQL学习12 - pymysql模块的使用
一.pymysql的下载和使用 1.pymysql模块的下载 2.pymysql的使用 二.execute()之sql注入 三.增.删.改:conn.commit() 四.查:fetchone.fet ...
- Python连接MySQL数据库之pymysql模块使用
安装PyMySQL pip install pymysql PyMySQL介绍 PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库,2中则使用mysqldb. Django中也 ...
- 操作mysql(import pymysql模块)
pymysql模块 import pymysql #1.连上数据库.账号.密码.ip.端口号.数据库 #2.建立游标 #3.执行sql #4.获取结果 #5.关闭游标 #6.连接关闭 #charest ...
- Python连接MySQL数据库之pymysql模块
pymysql 在python3.x 中用于连接MySQL服务器的一个库:Python2中则使用mysqldb pymysql的模块的基本的使用 # 导入pymysql模块 import pymysq ...
- mysql五:pymysql模块
一.介绍 之前都是通过MySQ自带的命令行客户端工具Mysql来操作数据库,那如何在Python程序中操作数据库呢?这就需要用到pymysql模块了. 这个模块本质就是一个套接字客户端软件,使用前需要 ...
- python关于MySQL的API -- pymysql模块
1.模块安装 pip install pymysql 2.执行sql语句 import pymysql #添加数据 conn = pymysql.connect(host='127.0.0.1', p ...
- MySQL:记录的增删改查、单表查询、约束条件、多表查询、连表、子查询、pymysql模块、MySQL内置功能
数据操作 插入数据(记录): 用insert: 补充:插入查询结果: insert into 表名(字段1,字段2,...字段n) select (字段1,字段2,...字段n) where ...; ...
- Python 3.5 连接Mysql数据库(pymysql 方式)
由于 MySQLdb 模块还不支持 Python3.x,官方的Mysql连接包只支持到3.4,所以 Python3.5 如果想连接MySQL需要安装 pymysql 模块. pymysql 模块可以通 ...
随机推荐
- 单目标优化问题 常用的 测试函数(MATLAB版)
############################################### # 测试函数 # ######## ...
- 如何快速切换目录cd-linux
前言 cd命令是linux系统中的基本命令行,表示改变工作目录.本文主要介绍几个常用的cd命令. 系统环境 OS:ubuntu16.04. 操作过程 cd www 表示切换到www目录: cd .. ...
- UnicodeDammit
UnicodeDammit 是BS内置库, 主要用来猜测文档编码. 编码自动检测 功能可以在Beautiful Soup以外使用,检测某段未知编码时,可以使用这个方法: from bs4 import ...
- mac 常用开发软件列表
toolbox app jetbrains系开发工具箱,包含了phpstorm idea等开发工具 Postman 接口调试工具,有插件版和单独的app两种.类似paw Sublime 文本编辑器,类 ...
- BZOJ1369/BZOJ2865 【后缀数组+线段树】
Description XX在进行字符串研究的时候,遇到了一个十分棘手的问题. 在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件: ...
- 【CQOI2008】中位数
题不难,但是思路有意思,这个是我自己想出来的OvO 原题: 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. n<= ...
- MySQL Transaction--RC和RR区别
在MySQL中,事务隔离级别RC(read commit)和RR(repeatable read)两种事务隔离级别基于多版本并发控制MVCC(multi-version concurrency con ...
- 个人博客:有态度的HBase/Spark/BigData
个人博客:有态度的HBase/Spark/BigData 关于我 本人范欣欣,男,就职于网易杭州研究院后台技术中心数据库技术组,专注于HBase的开发运维,热衷于MySQL等相关数据库技术.联系方式: ...
- Mac OS X 10.9.2 配置 jdk1.8.0_05 环境变量
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gcvdsvb/article/details/24543543 首先到 oracle 站点下载 ss ...
- 在Win7下新建库并修改图标
win7中在库中添加桌面方法详解 1.在空白处,鼠标右键选择新建——库. 2.命名为桌面,然后选择桌面. 3.鼠标右键选择属性. 4.点击包括文件夹. 5.选择桌面,点击包括文件夹按钮. 6.点击确定 ...