16-pymysql模块的使用

 

本节重点:

  • pymysql的下载和使用
  • execute()之sql注入
  • 增、删、改:conn.commit()
  • 查:fetchone、fetchmany、fetchall

 

一、pymysql的下载和使用

  之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢?这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装。

(1)pymysql模块的下载

  1. pip3 install pymysql

(2)pymysql的使用

数据库和数据都已存在

  1. # 实现:使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中)
  2.  
  3. import pymysql
  4. user = input('请输入用户名:')
  5.  
  6. pwd = input('请输入密码:')
  7.  
  8. # 1.连接
  9. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db8', charset='utf8')
  10.  
  11. # 2.创建游标
  12. cursor = conn.cursor()
  13.  
  14. #注意%s需要加引号
  15. sql = "select * from userinfo where username='%s' and pwd='%s'" %(user, pwd)
  16. print(sql)
  17.  
  18. # 3.执行sql语句
  19. cursor.execute(sql)
  20.  
  21. result=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
  22. print(result)
  23.  
  24. # 关闭连接,游标和连接都要关闭
  25. cursor.close()
  26. conn.close()
  27.  
  28. if result:
  29. print('登陆成功')
  30. else:
  31. print('登录失败')

二、execute()之sql注入

  1. 最后那一个空格,在一条sql语句中如果遇到select * from userinfo where username='mjj' -- asadasdas' and pwd='' 则--之后的条件被注释掉了(注意--后面还有一个空格)
  2.  
  3. #1、sql注入之:用户存在,绕过密码
  4. mjj' -- 任意字符
  5.  
  6. #2、sql注入之:用户不存在,绕过用户与密码
  7. xxx' or 1=1 -- 任意字符

解决方法: 

  1. # 原来是我们对sql进行字符串拼接
  2. # sql="select * from userinfo where name='%s' and password='%s'" %(username,pwd)
  3. # print(sql)
  4. # result=cursor.execute(sql)
  5.  
  6. #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
  7. sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
  8. result=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

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

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

  1. import pymysql
  2. username = input('请输入用户名:')
  3.  
  4. pwd = input('请输入密码:')
  5.  
  6. # 1.连接
  7. conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
  8.  
  9. # 2.创建游标
  10. cursor = conn.cursor()
  11.  
  12. # 操作
  13. # 增
  14. # sql = "insert into userinfo(username,pwd) values (%s,%s)"
  15.  
  16. # effect_row = cursor.execute(sql,(username,pwd))#同时插入多条数据#cursor.executemany(sql,[('李四','110'),('王五','119')])
  17. # print(effect_row)#
  18.  
  19. # 改
  20. # sql = "update userinfo set username = %s where id = 2"
  21. # effect_row = cursor.execute(sql,username)
  22. # print(effect_row)
  23.  
  24. # 删
  25. sql = "delete from userinfo where id = 2"
  26. effect_row = cursor.execute(sql)
  27. print(effect_row)
  28.  
  29. #一定记得commit
  30. conn.commit()
  31.  
  32. # 4.关闭游标
  33. cursor.close()
  34.  
  35. # 5.关闭连接
  36. conn.close()

四、查:fetchone、fetchmany、fetchall

  1. fetchone():获取下一行数据,第一次为首行;
  2. fetchall():获取所有行数据源
  3. fetchmany(4):获取4行数据

查看一下表内容:

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

使用fetchone():

  1. import pymysql
  2.  
  3. # 1.连接
  4. conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
  5.  
  6. # 2.创建游标
  7. cursor = conn.cursor()
  8.  
  9. sql = 'select * from userinfo'
  10. cursor.execute(sql)
  11.  
  12. # 查询第一行的数据
  13. row = cursor.fetchone()
  14. print(row) # (1, 'mjj', '123')
  15.  
  16. # 查询第二行数据
  17. row = cursor.fetchone()
  18. print(row) # (3, '张三', '110')
  19.  
  20. # 4.关闭游标
  21. cursor.close()
  22.  
  23. # 5.关闭连接
  24. conn.close()

使用fetchall():

  1. import pymysql
  2.  
  3. # 1.连接
  4. conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
  5.  
  6. # 2.创建游标
  7. cursor = conn.cursor()
  8.  
  9. sql = 'select * from userinfo'
  10. cursor.execute(sql)
  11.  
  12. # 获取所有的数据
  13. rows = cursor.fetchall()
  14. print(rows)
  15.  
  16. # 4.关闭游标
  17. cursor.close()
  18.  
  19. # 5.关闭连接
  20. conn.close()
  21.  
  22. #运行结果
  23. ((1, 'mjj', '123'), (3, '张三', '110'), (4, '李四', '119'))

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

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

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

  1. cursor.scroll(1,mode='relative') # 相对当前位置移动
  2. cursor.scroll(2,mode='absolute') # 相对绝对位置移动
  3. 第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动
  1. # 1.Python实现用户登录
  2. # 2.Mysql保存数据
  3.  
  4. import pymysql
  5.  
  6. # 1.连接
  7. conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
  8.  
  9. # 2.创建游标
  10. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  11.  
  12. sql = 'select * from userinfo'
  13. cursor.execute(sql)
  14.  
  15. # 查询第一行的数据
  16. row = cursor.fetchone()
  17. print(row) # (1, 'mjj', '123')
  18.  
  19. # 查询第二行数据
  20. row = cursor.fetchone() # (3, '张三', '110')
  21. print(row)
  22.  
  23. cursor.scroll(-1,mode='relative') #设置之后,光标相对于当前位置往前移动了一行,所以打印的结果为第二行的数据
  24. row = cursor.fetchone()
  25. print(row)
  26.  
  27. cursor.scroll(0,mode='absolute') #设置之后,光标相对于首行没有任何变化,所以打印的结果为第一行数据
  28. row = cursor.fetchone()
  29. print(row)
  30.  
  31. # 4.关闭游标
  32. cursor.close()
  33.  
  34. # 5.关闭连接
  35. conn.close()
  36.  
  37. #结果如下
  38.  
  39. {'id': 1, 'username': 'mjj', 'pwd': '123'}
  40. {'id': 3, 'username': '张三', 'pwd': '110'}
  41. {'id': 3, 'username': '张三', 'pwd': '110'}
  42. {'id': 1, 'username': 'mjj', 'pwd': '123'}

fetchmany():

  1. import pymysql
  2.  
  3. # 1.连接
  4. conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
  5.  
  6. # 2.创建游标
  7. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  8.  
  9. sql = 'select * from userinfo'
  10. cursor.execute(sql)
  11.  
  12. # 获取2条数据
  13. rows = cursor.fetchmany(2)
  14. print(rows)
  15.  
  16. # 4.关闭游标
  17.  
  18. # rows = cursor.fetchall()
  19. # print(rows)
  20. cursor.close()
  21.  
  22. # 5.关闭连接
  23. conn.close()
  24.  
  25. #结果如下:
  26. [{'id': 1, 'username': 'mjj', 'pwd': '123'}, {'id': 3, 'username': '张三', 'pwd': '110'}]

核心代码 哈哈哈 自己看

  1. import pymysql
  2.  
  3. #开启 连接数据库conn=pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='', db='pc')
  4.  
  5. #存入数据库cursor=conn.cursor()#创建游标对象 ,用游标对象创建sq语句sql='insert into pc.woshishui values (NULL ,"网","三")' #处理自增字段 直接把id设置为NULL
  6.  
  7. print(sql)cursor.execute(sql)
  8.  
  9. conn.commit()
  10.  
  11. #关闭数据库cursor.close()conn.close()

mysql 更新(九) pymysql模块的使用的更多相关文章

  1. Mysql(九):Python连接MySQL数据库之pymysql模块使用

    Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服 ...

  2. MySQL学习12 - pymysql模块的使用

    一.pymysql的下载和使用 1.pymysql模块的下载 2.pymysql的使用 二.execute()之sql注入 三.增.删.改:conn.commit() 四.查:fetchone.fet ...

  3. Python连接MySQL数据库之pymysql模块使用

    安装PyMySQL pip install pymysql PyMySQL介绍 PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库,2中则使用mysqldb. Django中也 ...

  4. 操作mysql(import pymysql模块)

    pymysql模块 import pymysql #1.连上数据库.账号.密码.ip.端口号.数据库 #2.建立游标 #3.执行sql #4.获取结果 #5.关闭游标 #6.连接关闭 #charest ...

  5. Python连接MySQL数据库之pymysql模块

    pymysql 在python3.x 中用于连接MySQL服务器的一个库:Python2中则使用mysqldb pymysql的模块的基本的使用 # 导入pymysql模块 import pymysq ...

  6. mysql五:pymysql模块

    一.介绍 之前都是通过MySQ自带的命令行客户端工具Mysql来操作数据库,那如何在Python程序中操作数据库呢?这就需要用到pymysql模块了. 这个模块本质就是一个套接字客户端软件,使用前需要 ...

  7. python关于MySQL的API -- pymysql模块

    1.模块安装 pip install pymysql 2.执行sql语句 import pymysql #添加数据 conn = pymysql.connect(host='127.0.0.1', p ...

  8. MySQL:记录的增删改查、单表查询、约束条件、多表查询、连表、子查询、pymysql模块、MySQL内置功能

    数据操作 插入数据(记录): 用insert: 补充:插入查询结果: insert into 表名(字段1,字段2,...字段n) select (字段1,字段2,...字段n) where ...; ...

  9. Python 3.5 连接Mysql数据库(pymysql 方式)

    由于 MySQLdb 模块还不支持 Python3.x,官方的Mysql连接包只支持到3.4,所以 Python3.5 如果想连接MySQL需要安装 pymysql 模块. pymysql 模块可以通 ...

随机推荐

  1. 单目标优化问题 常用的 测试函数(MATLAB版)

    ############################################### #                测试函数                     # ######## ...

  2. 如何快速切换目录cd-linux

    前言 cd命令是linux系统中的基本命令行,表示改变工作目录.本文主要介绍几个常用的cd命令. 系统环境 OS:ubuntu16.04. 操作过程 cd www 表示切换到www目录: cd .. ...

  3. UnicodeDammit

    UnicodeDammit 是BS内置库, 主要用来猜测文档编码. 编码自动检测 功能可以在Beautiful Soup以外使用,检测某段未知编码时,可以使用这个方法: from bs4 import ...

  4. mac 常用开发软件列表

    toolbox app jetbrains系开发工具箱,包含了phpstorm idea等开发工具 Postman 接口调试工具,有插件版和单独的app两种.类似paw Sublime 文本编辑器,类 ...

  5. BZOJ1369/BZOJ2865 【后缀数组+线段树】

    Description XX在进行字符串研究的时候,遇到了一个十分棘手的问题. 在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件: ...

  6. 【CQOI2008】中位数

    题不难,但是思路有意思,这个是我自己想出来的OvO 原题: 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. n<= ...

  7. MySQL Transaction--RC和RR区别

    在MySQL中,事务隔离级别RC(read commit)和RR(repeatable read)两种事务隔离级别基于多版本并发控制MVCC(multi-version concurrency con ...

  8. 个人博客:有态度的HBase/Spark/BigData

    个人博客:有态度的HBase/Spark/BigData 关于我 本人范欣欣,男,就职于网易杭州研究院后台技术中心数据库技术组,专注于HBase的开发运维,热衷于MySQL等相关数据库技术.联系方式: ...

  9. Mac OS X 10.9.2 配置 jdk1.8.0_05 环境变量

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gcvdsvb/article/details/24543543 首先到 oracle 站点下载 ss ...

  10. 在Win7下新建库并修改图标

    win7中在库中添加桌面方法详解 1.在空白处,鼠标右键选择新建——库. 2.命名为桌面,然后选择桌面. 3.鼠标右键选择属性. 4.点击包括文件夹. 5.选择桌面,点击包括文件夹按钮. 6.点击确定 ...