• 数据库之Python操作MySQL


    一、引言

      Python操作MySQL一共有两种方式,第一种是用原生模块pymysql和mysqldb,这两种模块在py2中都支持,但是在py3中只支持pymysql,但是pymysql可以通过pymysql.install_as_MySQLdb()的方式构造成和mysqldb一样的使用;第二种方式是ORM框架 SQLAchemy。

    二、pymysql

    下载安装

    pip install pymysql 

    增、删、改

    import pymysql
    
    # 增,删,改除了sql语句不同,使用的方式一致
    conn = pymysql.connect(host="localhost",user='root',password='',database="db2")   #连接mysql
    cursor = conn.cursor()      #创建游标
    sql = "insert into userinfo(username,password) values(%s,%s)"    #sql语句
    
    #r表示执行这条语句受影响的行数
    r = cursor.execute(sql ,['wusir','123'])
    #r = cursor.executemany(sql ,[('jack','213'),('tom','234')]) #表示插入多条数据,只有在插入数据的时候才使用executemany
    
    conn.commit()   #增删改执行一定要加conn.commit()
    cursor.close()   #关闭游标
    conn.close()  #关闭连接

    # 查
    conn = pymysql.connect(host="localhost",user='root',password='',database="db2")
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)    #使用这种游标查出来的数据是列表套子典
    cursor = conn.cursor() #使用这种游标查出来的数据是元祖套元祖 sql
    = "select * from userinfo" cursor.execute(sql) #cursor.scroll(1,mode='relative') # 让游标相对当前位置移动 #cursor.scroll(2,mode='absolute') # 让游标相对绝对位置移动
    #result
    = cursor.fetchone() # 取一个数据 #print(result) #result = cursor.fetchmany(4) #取指定数目的数据 #print(result)
    result = cursor.fetchall() #取查出来的所有数据
    print(result)
    cursor.close() conn.close() #PS:每取一个数据游标就会向下移动一位 # 新插入数据的自增ID: cursor.lastrowid
    # 如当有一个主从表时,从表要根据主表的id变化来插入数据,这时可以使用cursor.lastrowid来获取最新插入的主表id。

    避免mysql注入

      写一个很简单的基于mysql的登录程序,数据库里面只有一个user为alex,pwd为123,当使用第一种写法时会出现mysql注入的情况。

    import pymysql
    
    user = input('>>请输入用户名:')
    pwd = input('>>请输入密码:')
    
    conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='db2')
    cursor = conn.cursor()

    #第一种写法(不可以) sql
    = "select * from userinfo where name='%s' and pwd='%s'"%(user,pwd) cursor.execute(sql) res = cursor.fetchone() print(res)

    #第二种写法(可以)
    sql = "select * from userinfo where name=%s and pwd=%s"
    cursor.execute(sql,[user,pwd])
    res = cursor.fetchone()
    print(res)

    #第三种写法(可以)
    sql = "select * from userinfo where name=%(u)s and pwd=%(p)s"
    cursor.execute(sql,{'u':user,'p':pwd})
    res = cursor.fetchone()
    print(res)
    if res: 
      print(
    '登陆成功')
    else:
      print(
    '登陆失败')

      这就是mysql注入,因为mysql中的注释是--,使用这种字符串拼接会将后面的语句注释掉,同时1=1成立,这样就会出现即使没有这个用户也会登录成功。

  • 相关阅读:
    AT&T不能访问公司网络
    尝鲜:windows 7 来了
    .net控件编程 资料篇
    Annual part 2009
    从Visual studio 2005移出Visual Assist
    不能在IIS 5.1增加应用程序扩展的BUG
    The problem of the user is not associated with a trusted sql server connection 混合登录选项设置的问题
    让我们难忘的那些歌曲
    分享利用VPC防止病毒软件的进入你的windows电脑
    杂读 May 12,2008
  • 原文地址:https://www.cnblogs.com/wusir66/p/10121777.html
Copyright © 2020-2023  润新知