zoukankan      html  css  js  c++  java
  • 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文件
    
  • 相关阅读:
    MySql为查询结果添加前、后缀
    SQLHelper类
    OracleHelper类
    C#在sql中使用變量訪問Oracle數據庫
    转-调用HTMLTestRunner生成的报告中不能显示用例中print函数的输出
    HTMLTestRunner优化:带截图、饼图、失败重跑
    【转】如何成功安装旧版本火狐,成功安装firebug和firepath插件
    【转】Selenium 加载Chrome/Firefox浏览器配置文件
    mac查看python安装路径
    requests模拟上传照片
  • 原文地址:https://www.cnblogs.com/yunchao-520/p/13168811.html
Copyright © 2011-2022 走看看