pymysql的下载和使用

exctue() 之sql注入

增、删、改:conn.commit()

查:fetchone、fetchmany、fetchall

  一、pytmysql的下载和使用   

(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('登录失败')

  二、excute()之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的规矩来。

代码:

  1. #!C:/Python36/python3
  2. #-*- coding:utf-8 -*-
  3.  
  4. import pymysql
  5.  
  6. user = input('请输入用户名:')
  7. pwd = input('请输入密码:')
  8.  
  9. conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password = '',db='db4',charset='utf8')
  10. cursor = conn.cursor()
  11.  
  12. sql = "select * from userinfo WHERE username=%s and pwd = %s"
  13. print(sql)
  14.  
  15. # cursor.execute(sql)
  16. result = cursor.execute(sql,[user,pwd])
  17. print(result)
  18.  
  19. cursor.close()
  20. conn.close()
  21.  
  22. if result:
  23. print("登录成功")
  24.  
  25. else:
  26. print("登陆失败")

 三、增、删、改: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. # effect_row = cursor.execute(sql,(username,pwd))
  16.  
  17. # 同时插入多条数据
    # cursor.executemany(sql,[('李四','110'),('王五','119')])
  18. # print(effect_row)
  19.  
  20. # 改
  21. # sql = "update userinfo set username = %s where id = 2"
  22. # effect_row = cursor.execute(sql,username)
  23. # print(effect_row)
  24.  
  25. # 删
  26. sql = "delete from userinfo where id = 2"
  27. effect_row = cursor.execute(sql)
  28. print(effect_row)
  29.  
  30. #一定记得commit
  31. conn.commit()
  32.  
  33. # 4.关闭游标
  34. cursor.close()
  35.  
  36. # 5.关闭连接
  37. conn.close()

  四、查:fetchone、fetchmany、fetchall                           

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

使用 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', '')
  15.  
  16. # 查询第二行数据
  17. row = cursor.fetchone()
  18. print(row) # (3, '张三', '')
  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', ''), (3, '张三', ''), (4, '李四', '')) 

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

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

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

  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', '')
  18.  
  19. # 查询第二行数据
  20. row = cursor.fetchone() # (3, '张三', '')
  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': ''}
  40. {'id': 3, 'username': '张三', 'pwd': ''}
  41. {'id': 3, 'username': '张三', 'pwd': ''}
  42. {'id': 1, 'username': 'mjj', 'pwd': ''}

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'}]

08-----pymysql模块使用的更多相关文章

  1. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  2. python实战第一天-pymysql模块并练习

    操作系统 Ubuntu 15.10 IDE & editor JetBrains PyCharm 5.0.2 ipython3 Python版本 python-3.4.3 安装pymysql模 ...

  3. pymysql 模块介绍

    pymysql模块是python与mysql进行交互的一个模块. pymysql模块的安装: pymysql模块的用法: import pymysql user=input('user>> ...

  4. Mysql(六):数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...

  5. python如何使用pymysql模块

    Python 3.x 操作MySQL的pymysql模块详解 前言pymysql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而M ...

  6. MySQL之pymysql模块

    MySQL之pymysql模块   import pymysql #s链接数据库 conn = pymysql.connect( host = '127.0.0.1', #被连接数据库的ip地址 po ...

  7. PyMySQL模块的使用

    PyMySQL介绍 PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2系列中则使用mysqldb.Django中也可以使用PyMySQL连接MySQL数据库. ...

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

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

  9. 数据库入门-pymysql模块的使用

    一.pymysql模块安装 由于本人的Python版本为python3.7,所以用pymysql来连接数据库(mysqldb不支持python3.x) 方法一: #在cmd输入 pip3 instal ...

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

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

随机推荐

  1. 【摘自张宴的"实战:Nginx"】http auth baseic模块(打开页面需要密码验证)

    location /admin { auth_basic "kingsoft"; auth_basic_user_file httppasswd;      #密码文件的路径  默 ...

  2. python3-while与if

    # Auther: Aaron Fan age_of_oldboy = 56 #定义一个while循环的起始判断值countcount = 0#当count小于3的情况下一直执行while循环whil ...

  3. win7 64位 [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认

    问题描述: VBA程序连接Access数据库,Excel中执行相关宏,提示[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认 解决方案: 1.重新安装 AccessDa ...

  4. Windows下启动redis错误1067:进程意外中止

    已解决: 在redis-64.3.0.503文件夹下新建一个空文件夹,命名为logs,如下图所示: 最后成功了 开启服务:redis-server --service-start

  5. Jquery 插件开发——citylinkage(省、市、县城市联动选择)

    第一部分:背景  开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前呢,一直想写这个插件,然后错过了一个写这个插件的机会(这个得回顾到很久以前了. ...

  6. C#用GDI+解析Json文件绘制Chart

    using System.Collections.Generic; namespace Chart { public class Program { static void Main(string[] ...

  7. Oracle SQL判断字符串是否在目标字符串中的函数

    转自:http://dacoolbaby.iteye.com/blog/1772156 根据需求,写了一段方法. 用于识别以下的情况: 判断 字符串A  在用逗号分隔的字符串B中是否存在 如: v_s ...

  8. vue框架搭建的详细步骤(一)

    在这里我们先快速的搭建一个vue的脚手架: (1).在安装vue的环境之前,安装NodeJS环境是必须的.可以使用node -v指令检查,需要保证安装了4.0版本以上的nodeJS环境. 没有安装的话 ...

  9. UVa_Live 3664(精度坑)

    题意很好理解的贪心题,然而却卡疯了的精度坑. 再次理解一下double小数运算时可能导致的精度问题,本题为避免该问题可以将小数乘以100化为整数进行比较,输出的时候再除以100就ok: 思路也很好想, ...

  10. python安装出现的证书问题

    1. pip install pyenv 安装时出现下图错误 Could not install packages due to an EnvironmentError: HTTPSConnectio ...