zoukankan      html  css  js  c++  java
  • Python全栈开发之MySQL(二)------navicate和python操作MySQL

    一:Navicate的安装

    1.什么是navicate?

    Navicat是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。
    它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,
    让你可以以安全并且简单的方式创建、组织、访问并共用信息。

    简单的来说,我们刚开始是在命令行里面进行MySQL操作,但是我们目前接触的要求不多,如果是很长很复杂的命令怎么办,所以呢,就如python中的pycharm一样,当notepad++不能够满足你的要求的时候,就与一款新的软件来替代它,这里呢,简单说一下navicate的安装

    2.安装

    Navicat,用于连接数据库,
    - 查找
    - 修改
    - 根性
    ....
    # 点点点: -> SQL语句

    下载软件:在官网上下载Navicat  ,下载之后按照提示一直下一步就行,当然有英文版和中文版的,我这里使用的是破解版的中文版,

    简化简单操作
    创建表
    修改表结构
    插入
    查询
    更新
    删除

    我使用之后感觉功能在我们用命令行的时候差不多,但是这里简化了很多,很方便,而且也更多的功能,具体的效果大家可以实际操作以后就会感觉到,

    二:python操作MySQL

    2.1 下载安装

    首先呢,要想在pycharm中使用MySQL就要安装这个软件

          pip3 install pymysql  这是一条执行命令,就是通过pip3来安装pymysql这个模块,前提注意的是要在环境里面添加pip3这个路径,一定要注意,或者直接是在pycharm中settings这一项里面直接添加

    2.2    操作使用

    2.21  基本通过pymysql来执行一个MySQL语句  来看一下代码

    import pymysql
    #创建连接
    conn = pymysql.connect(host = "127.0.0.1",port = 3306,user = "root",passwd = "123456",db = "lianxi",charset = "utf8")
    #创建游标
    cursor = conn.cursor()
    cursor.execute("insert into class(caption) values('全栈二期')")
    #其实这里是受影响的行数,因为加入了一条所以呢这里的r结果就是 1
    #r = cursor.execute("select * from student where sid = 2") #print(r) #print(cursor.fetchone()) conn.commit() #提交 #关闭游标 cursor.close() #关闭连接 conn.close()

    2.3  pymysql   之增删改查

          先来看一下在pymysql中连接的问题,直接来看代码其中有详细的注释

    import pymysql
    #创建连接
    conn = pymysql.connect(host = "127.0.0.1",port = 3306,user = "root",passwd = "123456",db = "lianxi",charset = "utf8")
    #创建游标
    cursor = conn.cursor()
    #受影响的行数
    #r = cursor.execute("select * from student where sid = 2")
    #print(r)
    #print(cursor.fetchone())
    #字符串拼接sql,这里测试可以执行,禁止操作,但是这里不可以还有另外一种看下面
    # inp = input("请输入班级:")
    # sql = ""insert into class(caption) values('%s')
    # sql = sql %(inp,)
    # r = cursor.execute(sql)
    # print(r)
    
    #参数传递,必须使用参数的形式,因为上面的有可能会造成SQL注入,
    inp = input("请输入班级:")
    #注意这里最后面的%s的"",在这里是不需要加的,因为这里内部已经帮你拼接了
    r = cursor.execute("insert into class(caption) values('%s')",inp)
    r = cursor.execute("insert into class(caption) values(%s)",inp)
    
    conn.commit()   #提交
    #关闭游标
    cursor.close()
    #关闭连接
    conn.close()
    连接问题
    #插入多条的时候直接加上一个元组就行
    r = cursor.execute("insert into student(gender,class_id,sname) values(%s,%s,%s)",("",1,"鸭蛋"))
    连接多个
    增加数据
    r = cursor.execute("update student set sname = %s where sid = %s",("马打狗",1))
    更新数据
    r = cursor.execute("delete from score where sid = %s",(49,))
    conn.commit()   #提交
    删除数据

    切记,这些增删改数据 都是在连接和连接已经建立好的情况下才执行的,当然还有 在每一次命令执行之后必须有commit提交才能有结果

    但是呢,还有一点在下面的查 里面执行命令操作的时候是不需要commit的可看下面代码

    把里面的数据全部拿出来  以元组的形式
    # result = cursor.fetchall()
    # print(result)
    
    #只拿第一条数据
    # result = cursor.fetchone()
    # print(result)
    #这里如果再写这样一条数据那么拿到的就是第二条数据,再写就是第三条数据依次类推
    #其实也就是相当于一个指针,拿到一个继续往下一移一个
    # result = cursor.fetchone()
    # print(result)
    
    #可指定拿几条数据
    result = cursor.fetchmany(3)
    print(result)
    查数据
    在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
    
    cursor.scroll(1,mode='relative')  # 相对当前位置移动
    cursor.scroll(2,mode='absolute') # 相对绝对位置移动
    
    result = cursor.fetchone()
    print(result)
    #绝对的,就是回到前面所定义的位子
    #cursor.scroll(0,mode='absolute')
    #这里面可以写2表示相对的向下移动2位,如果写-2表示向上移动2位
    cursor.scroll(2,mode='relative')
    #这里如果再写这样一条数据那么拿到的就是第二条数据,再写就是第三条数据依次类推
    #其实也就是相当于一个指针,拿到一个继续往下一移一个
    result = cursor.fetchone()
    print(result)

    2.4 获取新创建数据自增ID

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import pymysql
      
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
    cursor = conn.cursor()
    cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
    conn.commit()
    cursor.close()
    conn.close()
      
    # 获取最新自增ID
    new_id = cursor.lastrowid

    2.5   fetch 数据类型

      关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import pymysql 
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lianxi') 
    # 游标设置为字典类型
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    r = cursor.execute("call p1()")
      
    result = cursor.fetchone()  
    conn.commit()
    cursor.close()
    conn.close()
    r = cursor.execute("select * from tb6666")
    print(cursor.fetchall())
    结果为:
    ((1, 'alex', 9, 'asasa', 'qqqqq', 'df'), (2, 'uu', 8, 'wr', 'wwww', 'df'),
    是以元组的形式存在的
    但是如果加上这样一句话
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    r = cursor.execute("select * from tb6666")
    print(cursor.fetchall())
    结果为:
    [{'name': 'alex', 'pwd': 'qqqqq', 'nid': 1, 'num': 9, 'user': 'df', 'email': 'asasa'},

    拿到的就是以字典的形式存的

    2.6 sql注入问题

       在我们使用用户密码登录的时候,使用字符串连接可能会照成SQL注入问题,因此,不能使用子字符串连接,下面就来简单了解一下原因,先来看一个简单得多例子,

    import pymysql
    #创建连接
    conn = pymysql.connect(host = "127.0.0.1",port = 3306,user = "root",passwd = "123456",db = "sss",charset = "utf8")
    #创建游标
    cursor = conn.cursor()
    cursor.execute("select name,pwd from userino where name = %s and pwd = %s ",("alex",123))
    result = cursor.fetchone()
    print(result)
    conn.commit()   #提交
    #关闭游标
    cursor.close()
    #关闭连接
    conn.close

    我们通过执行代码就可以拿到我们想要的结果,此时注意一点在代码中的%s这一个地方,这里没有"",是因为pycharm内部已经帮我们加上了引号“”,但是字符串连接为什么就有可能出问题呢来看下面

    sql = 'select name,pwd from userino where name = "%s" and pwd = "%s "'
    sql = sql %("alex",123)
    cursor.execute(sql)
    result = cursor.fetchone()
    print(result)
    执行这个代码也能得到结果,但是如果我改一下呢,看看有什么效果,来看下面的代码
    sql = 'select name,pwd from userino where name = "%s" and pwd = "%s "'
    sql = sql %('alex" or 1=1 -- ',1235)
    cursor.execute(sql)
    result = cursor.fetchone()
    print(result)
    
    这里执行完以后也能拿到你想要的结果,但是是为什么呢?里面的 or 1=1 其实也可以不要,这就是我们得SQL注入
    因为在SQL语句中我们得注释是-- ,所以呢在上面的代码中,我们得前一部分如果带入到name那一项中-- 就会把后面的那一部分注释掉,
    所以只要拿到一个正确的名字就可以拿到密码,这就是最基本的SQL注入,
    还有一点上面的or 1=1 是什么意思?就是说如果你写的名字不是Alex写成其他的也行但是没有影响因为你后面有or 1= 1
    相当于你无论写什么这个条件都是成立的,都会拿到结果,
    所以说呢,在这里不能这样用。
  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体< &gt: &等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/mars527/p/5992272.html
Copyright © 2011-2022 走看看