• python学习第38天


    一.python操作mysql

    1.1 基本语法

    创建连接 host user password database 这四个参数必须写

    import pymysql
    conn=pymysql.connect(host="127.0.0.1",user="root",password="",database="db0618",port=3306)
    

    创建游标对象,该对象可以进行增删改查操作

    cursor = conn.cursor()
    

    执行sql语句

    sql = "select * from employee"
    res = cursor.execute(sql) # 返回的是数据的总条数
    print(res)
    

    获取数据

    res = cursor.fetchone()
    print(res)
    

    释放游标对象.关闭连接

    cursor.close()
    conn.close()
    

    1.2 创建/删除 表

    conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0619")
    cursor = conn.cursor()
    
    # 1.创建一张表
    '''
    sql = """
    create table t1(
    id int unsigned primary key auto_increment,
    first_name char(10) not null,
    last_name char(10) not null,
    age int unsigned,
    sex tinyint,
    money float
    )
    """
    res = cursor.execute(sql)
    print(res)
    '''
    
    # 2.查看表结构
    """
    sql = "desc t1"
    res = cursor.execute(sql)
    print(res)  # 返回字段的个数
    print(cursor.fetchone())
    """
    
    # 3.删除表
    """
    try :
       sql = "drop table t1"
       res = cursor.execute(sql)
       print(res)
    except:
       pass
    
    cursor.close()
    conn.close()
    
    """
    

    1.3 事务处理

    python 操作事务处理  必须通过commit提交数据,才会真正的更新数据,否则rollback回滚,恢复到以前状态
    
    conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0618")
    cursor = conn.cursor()
    sql1 = "begin"
    sql2 = "select * from employee"
    sql3 = "update employee set emp_name = '111egon'  where id = 1 " 
    sql4 = "commit"
    
    res1 = cursor.execute(sql1)
    res2 = cursor.execute(sql2)
    res3 = cursor.execute(sql3)
    # res4 = cursor.execute(sql4)
    # print(res1,res2,res3,res4)
    # print(cursor.fetchone())
    
    cursor.close()
    conn.close()
    

    1.4 sql 注入攻击

    利用mysql语法的漏洞 来绕开检测密码和账户名的步骤,已达到登录别人账号的操作

    import pymysql
    user = input("user>>>: ").strip()
    pwd = input("password>>>: ").strip()
    
    conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0619")
    cursor = conn.cursor()
    
    sql = "select * from usr_pwd where username='%s' and password='%s'  " % (user,pwd)
    print(sql)
    
    res = cursor.execute(sql)
    print(res) # 查询数据的个数
    
    if res:
       print("登陆成功")
    else:
       print("登录失败")
       
    cursor.close()
    conn.close()
    

    当输入: 随便啥字符' or 1 =1 -- 随便啥字符时 即可绕过账号名和密码检测环节

    -- 代表后面的密码都是注释

    解决办法就是使用预处理机制,可以避免绝大多数的sql注入问题

    execute 参数1 是一个sql 语句 ,如果sql语句和里面的参数值分开执行,默认开启预处理

    execute(sql.(参数2,参数3...))

    import pymysql
    user = input("user>>>: ").strip()
    pwd = input("password>>>: ").strip()
    
    conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0619")
    cursor = conn.cursor()
    sql = "select * from usr_pwd where username=%s and password = %s"
    res = cursor.execute(sql, (user,pwd))
    
    print("登录成功" if res else "登录失败")
    
    cursor.close()
    conn.close()
    

    1.5 python 操作mysql 增

    python 操作mysql时候,默认开启事务,必须在增删改之后
    提交数据,才会对数据库产生影响,否则默认回滚
    
    提交数据: conn.commit()
    回滚数据: conn.rollback()
    
    execute     指定单条
    executemany 执行多条
    
    # 1.创建mysql连接
    conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0619")
    # 查询数据,默认是元组,可以设置返回字典类型, pymysql.cursors.DictCursor
    cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
    
    # 增
    """
    sql = "insert into t1(first_name , last_name ,age ,sex,money) values(%s,%s,%s,%s,%s)"
    # 一次插入一条数据
    # res = cursor.execute(sql,("王","振",80,0,12000))
    # print(res)
    
    # 一次插入多条数据
    res = cursor.executemany(sql,[("尉","翼麟",18,1,12000),("谢","晨",80,0,200),("主","胜",3,0,9.9)])
    print(res)
    
    # 获取最后插入这条数据的id号(针对于单条数据执行,获取最后的id,如果多条数据的执行,以第一条数据的id为主)
    print(cursor.lastrowid)
    # 针对于多条数据最后的id,可以通过倒序查询,找到id号
    # select id from t1 order by id desc limit 1
    

    1.6 删

    sql = "delete from t1 where id = %s"
    res = cursor.execute(sql,(8,))
    print(res)
    
    if res:
       print("删除成功")
    else:
       print("删除失败")
    

    executemany可以删除多条数据

    1.7 改

    sql = "update t1 set first_name = %s where id = %s"
    res = cursor.execute(sql,('王',10))
    print(res)
    
    if res:
       print("更新成功")
    else:  
       print("更新失败")
    

    executemany 可以更改多条数据

    1.8 查

    fetchone 获取一条数据

    fetchmany 获取多条数据,默认从上一条数据继续向下搜索(性质类似于迭代器)

    fetchall获取所有数据基于上一条数据往下搜索(性质类似于迭代器)

    sql = "select * from t1"
    res = cursor.execute(sql)
    # print(res) # 总条数
    
    # (1) 获取一条数据 fetchone
    # res = cursor.fetchone()
    # print(res) # {'id': 9, 'first_name': '王', 'last_name': '翼麟', 'age': 18, 'sex': 1, 'money': 12000.0}
    
    # (2) 获取多条数据 fetchmany 默认从上一条数据继续向下搜索(性质类似于迭代器)
    # data = cursor.fetchmany() # 没有参数,默认只获取一条
    # data = cursor.fetchmany(3)  
    # print(data)
    

    自定义搜索查询的位置

    sql = "select * from t1  where id >=10"
    res = cursor.execute(sql)
    
    res = cursor.fetchone()
    print(res)
    

    相对滚动

    #向后
    cursor.scroll(3,mode="relative")
    res = cursor.fetchone()
    print(res)
    
    # 方向向前 (无论前后,不能超出范围)
    cursor.scroll(-3,mode="relative")
    res = cursor.fetchone()
    print(res)
    

    绝对滚动,永远基于第一条数据的位置滚动

    cursor.scroll(0,mode="absolute")
    print(cursor.fetchone())
    
    cursor.scroll(1,mode="absolute")
    print(cursor.fetchone())
    
    cursor.scroll(2,mode="absolute")
    print(cursor.fetchone())
    
    # 往前滚没数据,超出范围error
    cursor.scroll(-1,mode="absolute")
    print(cursor.fetchone())
    

    在进行增删改的时候,必须通过commit提交数据,才会对数据库进行更新,否则默认回滚

    1.9导出数据库

    第一步 : 先退出数据库
    第二部 : 切换到对应的导出路径
    第三步 :
       # 导出所有
       mysqldump -uroot -p 数据库名 > 数据库名.sql
       # 导出单个
       mysqldump -uroot -p db0619 t1 > t1.sql
    

    2.0导入数据库

    第一步 : 先创建一个空的数据库
    第二部 : 找到对应的sql文件的路径
    第三步 : source 路径/sql文件
    
  • 相关阅读:
    1105 Spiral Matrix (25分)(蛇形填数)
    1104 Sum of Number Segments (20分)(long double)
    1026 Table Tennis (30分)(模拟)
    1091 Acute Stroke (30分)(bfs,连通块个数统计)
    1095 Cars on Campus (30分)(排序)
    1098 Insertion or Heap Sort (25分)(堆排序和插入排序)
    堆以及堆排序详解
    1089 Insert or Merge (25分)
    1088 Rational Arithmetic (20分)(模拟)
    1086 Tree Traversals Again (25分)(树的重构与遍历)
  • 原文地址:https://www.cnblogs.com/yunchao-520/p/13168811.html
Copyright © 2020-2023  润新知