zoukankan      html  css  js  c++  java
  • 16-pymysql模块的使用

    【转】16-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'}]
  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/orangehero/p/10367956.html
Copyright © 2011-2022 走看看