zoukankan      html  css  js  c++  java
  • 数据库可视化工具简介以及pymysql的使用

    1.可视化工具Navicat

      我们自己开发测试时,可以使用该可视化工具,以图形界面的形式操作数据库

      在生产环境中,为了显示自己的逼格,一般不建议使用它

    官网下载:https://www.navicat.com/en/products/navicat-for-mysql

    网盘下载:https://pan.baidu.com/s/1bpo5mqj

    2.pymysql的使用

    2.1模块的下载(终端)

    pip install pymysql

    2.2链接,执行sql以及关闭游标

      这是我在test库下创建的ttt表格

    import pymysql
    
    user = input('username:').strip()
    pwd = input('password:').strip()
    
    # 链接
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')
    
    # 创建游标对象
    cursor = conn.cursor()
    
    # 执行mysql语句
    sql='select * from ttt where name="%s" and password="%s"' %(user,pwd)
    print(sql)
    
    # 执行sql语句,返回sql查询成功的记录数目,输入错误则是0,正确输出1
    result = cursor.execute(sql)
    print(result)
    
    cursor.close()
    conn.close()

    类似结果

    2.3 execute()之sql注入

      看看下面两种输入方式(注意输入的是单引号还是双引号,另--后面还有空格,否则输出是0)

      在用户名输入正确的情况下绕过密码(bob"-- 任意字符)

      直接绕过用户名和密码访问(xxx' or 1=1 -- 任意字符)

    造成上面结果的原理:

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

    解决办法:

       核心就是不使用字符串拼接方方式去访问就ok,下面是修改的代码

    import pymysql
    
    user = input('username:').strip()
    pwd = input('password:').strip()
    
    # 链接
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')
    
    # 创建游标对象
    cursor = conn.cursor()
    
    # 执行mysql语句,这里两个%不需要加上引号,mysql会默认给加上,另外pymysql模块自动帮我们
    # 将uer和pwd注入,所以下面括号内的内容必不可少(也可以是列表),它其实间接的和字符串拼接是一个道理
    sql = "select * from ttt where name=%s and password=%s"
    print(sql)     # 这步没啥意义,就是让你看看结果
    res = cursor.execute(sql,(user,pwd))
    print(res)
    
    cursor.close()
    conn.close()

    结果

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

        这里一定要有execute执行和commit提交这几步

    import pymysql
    
    # 链接
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')
    
    # 创建游标对象
    cursor = conn.cursor()
    
    # 增一个
    sql = "insert into ttt(name,password) values(%s,%s);"
    res = cursor.execute(sql,('luffy',666))
    
    
    # 增多个
    sql = "insert into ttt(name,password) values(%s,%s);"
    res = cursor.executemany(sql,[('qq',454),('ww',574),('ee',322)])   # 必须放进一个大的列表里
    
    # 改操作
    sql = "update ttt set name = %s  where id = 4;"
    cursor.execute(sql,'zoro')
    
    # 删操作
    sql = "delete from ttt where id=2;"
    cursor.execute(sql)   # 删除了这步执行语句也得要有
    
    
    conn.commit()   # 提交语句,必须要有,别忘啊
    cursor.close()
    conn.close()

    2.5查 fetchone,fetchmany,fetchall(属于光标操作)

    fetchone():获取下一行数据,第一次为首行;
    fetchall():获取所有行数据源
    fetchmany(4):获取4行数据

    上面的表经过增删改后:

    fetchone()与fetchall()

    import pymysql
    
    # 链接
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')
    
    # 创建游标对象
    cursor = conn.cursor()  # 默认返回元祖形式
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)   # 它返回的是一个字典
    
    # 查操作,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
    sql = "select * from ttt;"
    rows = cursor.execute(sql)
    
    # 查询单个
    res1=cursor.fetchone()   # 查找出id是1的
    res2=cursor.fetchone()   # 查找出id是3的
    print(res1)
    print(res2)
    
    # 对rows进行操作,查找所有,注意这里的所有指的是id是3以后的了,光标已经移动了
    rows = cursor.fetchall()
    print(rows)
    
    conn.commit()   # 提交语句,必须要有,别忘啊
    cursor.close()
    conn.close()

    注意,当使用fetchone获取数据时,如果光标已经到最后一行,则会返回none,我们可以采用下面方式移动指针

    cursor.scroll(1,mode='relative')  # 相对当前位置移动
    cursor.scroll(2,mode='absolute') # 相对绝对位置移动
    第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动
  • 相关阅读:
    给jdk写注释系列之jdk1.6容器(9)-Strategy设计模式之Comparable&Comparator接口
    给jdk写注释系列之jdk1.6容器(8)-TreeSet&NavigableMap&NavigableSet源码解析
    给jdk写注释系列之jdk1.6容器(7)-TreeMap源码解析
    给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器
    给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析
    给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析
    给jdk写注释系列之jdk1.6容器(3)-Iterator设计模式
    给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析
    给jdk写注释系列之jdk1.6容器(1)-ArrayList源码解析
    留言板
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9185380.html
Copyright © 2011-2022 走看看