zoukankan      html  css  js  c++  java
  • python连接MySQL pymysql模块,游标,SQL注入问题,增删改查操作

    pymysql模块

    pymysql是用python控制终端对MySQL数据库进行操作的第三方模块

    import pymysql
    # 1.连接数据库
    client = pymysql.connect(
        # 地址
        host='127.0.0.1',
        # 数据库端口
        port=3306,
        # 用户名,要加引号
        user='root',
        # 密码,要加引号
        password='2694',
        # 文件夹
        database='db2',
        # 设置字符编码不能写成了utf-8
        charset='utf8',
        # 设置自动提交命令,如不设置则无法提交命令进行增,改,删操作
        autocommit=True
    )
    
    # 2.获取游标对象 ——————》可以通过游标来提交SQL命令,
    # cursor_obj = client.cursor() 以元组形式返回
    # pymysql.cursors.DictCursor 将查询出来的结果制作成字典形式返回
    cursor_obj = client.cursor(pymysql.cursors.DictCursor)
    
    # 3.通过execute提交SQL语句
    # SQL语句要用引号,不要加 ; 号
    sql = 'select * from emp'
    # 提交SQL语句
    cursor_obj.execute(sql)
    
    # 4.提交后,通过cursor_obj.fetchall()获取查询游标后的全部的结果
    res = cursor_obj.fetchone()  # 只获取游标后的一条结果
    res = cursor_obj.fetchall()  # 获取查询游标后的全部的结果
    res = cursor_obj.fetchmany(3)  # 指定获取游标后的几条数据,可以超过不会报错
    # 获取的是列表套字典
    # print(res)
    for dic in res:
        print(dic)
    
    # 5.关闭游标
    cursor_obj.close()
    
    # 6.关闭客户端连接
    client.close()

    游标的相对移动和绝对移动

    print(cursor_obj.fetchone())    #获取一个结果
    print(cursor_obj.fetchone())
    print(cursor_obj.fetchall())    #获取所有结果
    # print(cursor.fetchmany(2))  # 指定获取几条数据  如果数字超了也不会报错
    
    >>>{'id': 1, 'name': 'Mr沈', 'sex': 'male', 'age': 17}
    {'id': 2, 'name': 'tate', 'sex': 'male', 'age': 18}
    [{'id': 3, 'name': 'ank', 'sex': 'male', 'age': 18},{'id': 4, 'name': 'vicky', 'sex': 'female', 'age': 18}]

    如果想控制游标的移动位置来获取结果可以用相对移动或绝对移动

    相对移动:cursor.scroll(2, 'relative')  # 基于指针所在的位置往后偏移两位,下次获取就获取指针后的数据
    绝对移动:cursor.scroll(1, 'absolute')  #基于起始位置往后偏移1位

    SQL注入问题

    SQL注入问题:利用特殊符号和注释语法,巧妙的绕过真正的SQL校验

    解决方法:关键性的数据校验,不要手动拼接,execute会自带拼接功能,可以解决这个问题

    import pymysql
    client = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        database='day36',
        user='root',
        password='2694',
        charset='utf8',
        autocommit=True
    )
    cursor_obj = client.cursor(pymysql.cursors.DictCursor)
    username = input('请输入用户名').strip()
    password = input('请输入密码:').strip()
    # sql = 'select * from db where username="%s" and password="%s"'%(username,password)  # 此处%s必须要加引号
    sql = 'select * from db where username="%s" and password="%s"'  # 此处%s可以不用加引号
    print(sql)
    res = cursor_obj.execute(sql,(username,password))  # 自带拼接功能将execute后的参数与SQL一一对应传入,只能替换%占位符
    if res:
        print(res) # 显示所有操作的数据条数
    else:
        print('用户名或密码错误')
    
    
    
    #请输入用户名wqjed" or 2=2 -- wqjdkef
    # 请输入密码:
    # select * from db where username="wqjed" or 2=2 -- wqjdkef" and password=""
    # 1
    
    
    # 请输入用户名shen" -- weiqfewq
    # 请输入密码:
    # select * from db where username="shen" -- weiqfewq" and password=""
    # 1

     

    数据的增删改查

    import pymysql
    
    # 连接数据库函数
    def client_mysql():
        client = pymysql.connect(
            host='127.0.0.1',
            port=3306,  # 端口号不能加引号
            user='root',
            password='2694',
            database='db2',
            charset='utf8',
            autocommit=True
        )
        cursor_obj = client.cursor(pymysql.cursors.DictCursor)
        return cursor_obj, client
    
    # 关闭数据库函数
    def close_client():
        cursor_obj, client = client_mysql()
        cursor_obj.close()
        client.close()
    
    cursor_obj, client = client_mysql()
    # 插入数据
    # 插入表格
    sql = 'create table user(id int primary key,name varchar(20))'
    cursor_obj.execute(sql)
    # 插入数据
    s = 'insert into user(id,name) values(7,"vicky")'
    cursor_obj.execute(s)
    
    # 查看数据
    res = 'select * from user'
    cursor_obj.execute(res)
    res = cursor_obj.fetchall()
    print(res)
    
    # 更新数据
    try:
        sql = 'update user set name="shen" where id=7'
        cursor_obj.execute(sql)
    except Exception as e:
        print(e)
    res = 'select * from user'
    # 查看更新后的数据
    cursor_obj.execute(res)
    res = cursor_obj.fetchall()
    print(res)
    
    # 删除数据
    sql = 'delete from user'
    cursor_obj.execute(sql)
    # 查看更新后的数据
    res = 'select * from user'
    cursor_obj.execute(res)
    res = cursor_obj.fetchall()
    print(res)
    # 关闭连接
    close_client()
  • 相关阅读:
    python中装饰器
    python中函数后面的小括号的作用
    python中闭包
    python中LEGB原则
    python中不能在外层函数以外调用内层函数
    “咏刚的家”全新改版
    四个半月——我离 Google 有多远?
    关于翻译的两篇好文章
    崔健,又见崔健
    第一天——适逢惊蛰
  • 原文地址:https://www.cnblogs.com/ludingchao/p/12040592.html
Copyright © 2011-2022 走看看