• 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
    相当于你无论写什么这个条件都是成立的,都会拿到结果,
    所以说呢,在这里不能这样用。
  • 相关阅读:
    Error: unable to load xmlsec-openssl library
    count(1)、count(*)与count(列名)的执行区别
    Linux下的压缩zip,解压缩unzip命令详解及实例
    linux centos 如何查看操作系统版本信息
    These dependencies were not found: *!!vue-style-loader!css-loader?
    Git如何永久删除某个重要文件文件或文件夹 (包括历史记录) 强制
    LDAP的filter查询详解
    详谈mysqldump数据导出的问题
    GO -- 遍历删除 数组 slice
    mjml强大&&灵活的邮件模版引擎
  • 原文地址:https://www.cnblogs.com/mars527/p/5992272.html
Copyright © 2020-2023  润新知