zoukankan      html  css  js  c++  java
  • Python_pymysql

    pymysql安装:pip3 install pymysql

      第一个实例:连接数据库进行用户验证

    条件:数据库中已存在一个用户表,包含用户名、密码

    import pymysql
    user = input("username:")
    pwd = input("password:")
    # 连接数据库,只是打开数据库
    db = pymysql.connect(host='localhost', 
                  user='root',
                  password='123456',
                  database='userinfo', # 所用的数据库名
                  charset = 'utf-8'
    ) # host 数据库所在主机位置 cursor = db.cursor() # 游标,通过游标查询进行对数据库的操作,from 后是所用的表名 sql = "select * from user_pwd where username = '%s' and password = '%s'"%(user,pwd) # 这里是运用的是字符串替换 cursor.execute(sql) # 在数据库中通过语句查询 data = cursor.fetchone() # 查询结果运用fetchall() 把结果拿出来 cursor.close() # 关闭游标的使用 db.close() # 关闭数据库 if data: print("登陆成功") else: print("登陆失败")

    在数据库操作中,字符串替换的操作方式,可能会遇见数据注入,何为数据注入?

    例:当把用户名输入: uu' 1=1 --   

    若遇见这个情况

    sql = "select * from user_pwd where username = '%s' and password = '%s'"%(user,pwd)

    字符串替换后

    sql = "select * from user_pwd where username = 'uu' or 1=1 --' and password = '%s'"

    # (这里的-- 在数据库中表示的是注释的意思),所以 用户名username = uu,1=1 绝对成立,所以就绕过了用户验证直接验证成功!!   这就是数据注入!!

    在pymysql 中 .execute() 函数对数据替换进行了相关处理,可直接用此函数进行字符替换,所以实例应写为:

    import pymysql
    user = input("username:")
    pwd = input("password:")
    # 连接数据库,只是打开数据库
    db = pymysql.connect(host='localhost', user='root',password='123456', database='userinfo')   # host 数据库所在主机位置
    cursor = db.cursor()   # 游标
    sql = "select * from user_pwd where username = %s and password = %s"
    cursor.execute(sql,(user,pwd))  # 这里不能是%,或者.format()的字符串替换,利用,可进行correctly转义,从而避免sql注入的发生
    # cursor.execute(sql,[user,pwd])  # 另一种写法
    #第三种写法
    # sql = "select * from user_pwd where username = %(u)s and password = %(p)s"
    #cursor.execute(sql,{'u':user,'p':pwd})
    data = cursor.fetchone() # 查询结果
    cursor.close()
    db.close() 
    if data: 
        print("登陆成功") 
    else: 
        print("登陆失败")
      pymysql的增删改

    注:增删改都需要sql语句提交:conn.commit()

    一、增加

    1.基础版

    import pymysql
    db = pymysql.connect(host='localhost', user='root',password='123456', database='userinfo')   # host 数据库所在主机位置
    cursor = db.cursor()   # 游标
    sql = "insert into user_pwd(username,password) values('vera', '1234')"  # 其中数据库中id为自增序列,否则报错
    cursor.execute(sql)
    print(cursor.lastrowid) # 这里得到的是数据库中自增id的id值 db.commit()
    # 只要要修改表中的数据,都必须commit提交sql语句 cursor.close() db.close()

    2.一级进阶版:手动输入用户名、密码

    import pymysql
    user = input('username:')
    pwd = input('password:')
    db = pymysql.connect(host='localhost', user='root',password='123456', database='userinfo')   # host 数据库所在主机位置
    cursor = db.cursor()   # 游标
    sql = "insert into user_pwd(username,password) values(%s,%s)"
    cursor.execute(sql,(user,pwd))    # 手动输入用户名,密码  # 有一个返回值:受影响的行数(1行)
    
    db.commit()   # 只要要修改表中的数据,都必须commit提交sql语句
    cursor.close()
    db.close()

    3.二级进阶:输入两个用户名、密码同时插入数据库(运用:cursor.executemany()函数)

    import pymysql
    
    db = pymysql.connect(host='localhost', user='root',password='123456', database='userinfo')   # host 数据库所在主机位置
    cursor = db.cursor()   # 游标
    # sql = "insert into user_pwd(username,password) values(%s,%s)"
    # cursor.execute(sql,(user,pwd))
    
    sql = "insert into user_pwd(username,password) values(%s,%s)"
    cursor.executemany(sql,[('guan_guan','22'),('you_you','33')]) # 有一个返回值:受影响的行数
    print(cursor.lastrowid) # 这里拿到的id值为插入数据的最后一个id的id值
    db.commit()
    # 只要要修改表中的数据,都必须commit提交sql语句 cursor.close() db.close()

    删除和修改同上(除sql语句不同)

      pymysql 的查

    主要是数据查到的条数不同有不同的函数

    1.fetch系列

    import pymysql
    
    db = pymysql.connect(host='localhost', user='root',password='123456', database='userinfo')   # host 数据库所在主机位置
    cursor = db.cursor()   # 游标
    sql = "select * from user_pwd"
    cursor.execute(sql)
    
    # 只取查询到的第一条
    # data = cursor.fetchone()   # 查询结果
    # 表示这是游标指针进行的查询
    # data = cursor.fetchone()   # (配合上一条一起)查询结果从2开始
    # 取查询到的指定条数的查询结果 # data = cursor.fetchmany(3) # 取查询到的全部结果 data = cursor.fetchall() print(data) cursor.close() db.close()

    2.指定位置开始打印结果

    cursor.scroll(2,mode='relative')  # 相对当前位置移动
    # cursor.scroll(3,mode='absolute')  # 相对绝对位置移动
    第一个值为移动的行动,整数为向下移动,负数为向下移动,mode指定了是相对当前位置移动,还是相对于行首移动
    import pymysql
    
    db = pymysql.connect(host='localhost', user='root',password='123456', database='userinfo')   # host 数据库所在主机位置
    cursor = db.cursor()   # 游标
    sql = "select * from user_pwd"
    cursor.execute(sql)
    
    # 指定位置开始查询
    cursor.scroll(2,mode='relative')  # 相对当前位置移动
    # cursor.scroll(3,mode='absolute')  # 相对绝对位置移动
    
    # 只取查询到的第一条
    data = cursor.fetchone()   # 查询结果
    
    print(data)
    cursor.close()
    db.close()

    3.利用pymysql.cursors.DictCursor参数返回字典便于查看

    import pymysql
    
    db = pymysql.connect(host='localhost', user='root',password='123456', database='userinfo')   # host 数据库所在主机位置
    cursor = db.cursor(cursor=pymysql.cursors.DictCursor)   # 游标,默认cursor=None
    sql = "select * from user_pwd"
    cursor.execute(sql)
    
    # 取查询到的全部结果
    data = cursor.fetchall()
    print(data)   # 打印的为列表中有字典便于查看
    cursor.close()
    db.close()

    例子所用数据库:https://files.cnblogs.com/files/Vera-y/myemployees.zip

  • 相关阅读:
    phpMyAdmin出现错误 Access denied for user 'root'@'localhost' (using password: NO)
    Android使用butterknife注解出现nullPointerException解决
    Fragment Touch事件泄露
    清空Fragment回退栈中某个Fragment之上的所有Fragment
    Fragment保持状态切换
    点击EditText可编辑,点击其他地方不可编辑
    android ActionBar 去掉menu分隔线
    jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
    php 闭包函数
    phpstorm快捷按键
  • 原文地址:https://www.cnblogs.com/Vera-y/p/11008153.html
Copyright © 2011-2022 走看看