• day 7-21 pymysql模块


    一、安装的两种方法

    第一种:

    #安装
    pip3 install pymysql

    第二种:

    二、链接,执行sql,关闭(游标)

    import pymysql
    
    user = input("username:").strip()
    pwd = input("password:").strip()
    
    #1.先建立连接,然后拿到游标
    conn=pymysql.connect(host="localhost",user="root",password="234",
                         database="db7",charset="utf8"
    
                         )
    cursor =conn.cursor()   #拿到游标
    
    #2.执行sql
    
    sql = "select * from user where name='%s' and password = '%s';"%(user,pwd)
    print(sql)
    
    rows = cursor.execute(sql)  #拿到受影响的行数
    print(rows)
    #3.关闭游标
    cursor.close()
    #4.关闭连接
    conn.close()
    
    if rows:
        print("登录成功")
    else:
        print("登录失败")

    三、execute()之sql注入

    注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

    根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

    最后那一个空格,在一条sql语句中如果遇到select *
    from t1 where id > 3 -- and name='jack';则--之后的条件被注释掉了
    
    #1、sql注入之:用户存在,绕过密码
    jack' -- 任意字符
    
    #2、sql注入之:用户不存在,绕过用户与密码
    xxx' or 1=1 -- 任意字符

    解决注入

    # 原来是我们对sql进行字符串拼接
    # sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
    # print(sql)
    # rows=cursor.execute(sql)
    
    #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
    sql="select * from userinfo where name=%s
     and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
    rows=cursor.execute(sql,[user,pwd])
    #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
    #2.防止注入
    
    
    import pymysql
    
    user = input("username:").strip()
    pwd = input("password:").strip()
    
    #1.先建立连接,然后拿到游标
    conn=pymysql.connect(host="localhost",user="root",password="234",
                         database="db7",charset="utf8"
    
                         )
    cursor =conn.cursor()   #拿到游标
    
    #2.执行sql
    
    sql = "select * from user where name=%s and password = %s;"
    print(sql)
    
    rows = cursor.execute(sql,[user,pwd])  #在这里传入参数
    print(rows)
    #3.关闭游标
    cursor.close()
    #4.关闭连接
    conn.close()
    
    if rows:
        print("登录成功")
    else:
        print("登录失败")
    防止注入

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

    增:

    import pymysql
    
    # 1.连接拿到游标
    conn=pymysql.connect(host="localhost",user="root",password="234",
                         database="db7",charset="utf8"
                         )
    cursor=conn.cursor()  # 拿到游标,即mysql>
    
    # 2.执行sql
    sql='insert into user (name,age,password) values(%s,%s,%s);'
    print(sql)
    # 2.1插入单条记录
    # rows = cursor.execute(sql,["lucy",21,"123"])
    # 2.3插入多条记录
    rows=cursor.executemany(sql,[("ago",26,"123"),("Lili",23,"123")])
    conn.commit()  # 这一步是提交到数据库的.如果没有这一步,上面的插入不生效
    #3.关闭游标
    cursor.close()
    #4.关闭连接
    conn.close()

    删:

    import pymysql
    
    #
    name = input("name:").strip()
    # 1.连接拿到游标
    conn=pymysql.connect(host="localhost",user="root",password="234",
                         database="db7",charset="utf8"
                         )
    cursor=conn.cursor()  # 拿到游标,即mysql>
    
    # 2.执行sql
    sql='delete from user where name = %s;'
    print(sql)
    rows = cursor.execute(sql,(name))
    print('%s row in set (0.00 sec)'%rows)
    #提交到数据库
    conn.commit()
    #3.关闭游标
    cursor.close()
    #4.关闭连接
    conn.close()

    改:

    import pymysql
    
    #
    id = input("id:").strip()
    # 1.连接拿到游标
    conn=pymysql.connect(host="localhost",user="root",password="234",
                         database="db7",charset="utf8"
                         )
    cursor=conn.cursor()  # 拿到游标,即mysql>
    
    # 2.执行sql
    sql='update user set password ="999999" WHERE  id = %s;'
    print(sql)
    rows = cursor.execute(sql,(id))
    print('%s row in set (0.00 sec)'%rows)
    #提交到数据库
    conn.commit()
    #3.关闭游标
    cursor.close()
    #4.关闭连接
    conn.close()

    五、查:fetchone,fetchmany,fetchall

    import pymysql
    
    #查:fetchone,fetchmany,fetchall
    
    # 1.连接拿到游标
    conn=pymysql.connect(host="localhost",user="root",password="234",
                         database="db7",charset="utf8"
                         )
    cursor=conn.cursor()  # 拿到游标,即mysql>
    注:如果当有很多条sql记录的时候,用上面的方式拿到游标,并不能显示字段信息.要使用下面的方式:
    cursor=conn.cursor(pymysql.cursor.DictCursor) # 2.执行sql sql='select * from user;' rows = cursor.execute(sql) #单条查询 res1 = cursor.fetchone() res2 = cursor.fetchone() res3 = cursor.fetchone() res4 = cursor.fetchone() res5 = cursor.fetchone() res6 = cursor.fetchone() #数据库里只有5条记录,没有第六条,输入None print(res1) print(res2) print(res3) print(res4) print(res5) print(res6) #输入None #查询多条 res = cursor.fetchmany(4) #一次查询4条 print(res) #查询所有 res = cursor.fetchall() print(res) #-----------------------光标移动-------------------------- #1,绝对移动:从文件开头位置算起 print(cursor.fetchall()) cursor.scroll(0,mode="absolute") #0是开头的位置,所以下次读取的内容和上次是一样的 print(cursor.fetchall()) cursor.scroll(1,mode="absolute") #1是第一个数据之后的位置(光标移动到第一个数据的尾部),下次读取从第二个开始 print(cursor.fetchall()) #2,相对移动 print(cursor.fetchone()) print(cursor.fetchone()) cursor.scroll(1,mode='relative') #相对于前面2个,把光标移动到下一个数据的尾部.(即前面数据数量+1的数据尾部的位置) print(cursor.fetchone()) #3.关闭游标 cursor.close() #4.关闭连接 conn.close()

     六、获取插入的最后一条数据的自增ID

    import pymysql
    conn=pymysql.connect(host='localhost',user='root',password='234',
                         database='db7',charset='utf8')
    cursor=conn.cursor()
    
    
    sql='insert into user(name,age,password) values(%s,%s,%s);'
    rows=cursor.execute(sql,('alex1',20,'123'))
    # rows=cursor.executemany(sql,[('yuanhao','123'),('laowu','123'),('kgf','12323')])
    conn.commit()
    print(cursor.lastrowid)  #查看表中最后一行的iD
    
    cursor.close()
    conn.close()
  • 相关阅读:
    三元组数据结构
    线性表的顺序表示和实现 数据结构
    【欧拉计划1】Multiples of 3 and 5
    strcmp()与strcmpi()函数 C语言
    指向函数的指针 C语言
    const限定符声明 C语言
    Java环境搭建与配置
    栈的C语言实现
    【欧拉计划2】Even Fibonacci numbers
    单链表的表示和实现 数据结构
  • 原文地址:https://www.cnblogs.com/lovepy3/p/9419210.html
Copyright © 2020-2023  润新知