数据库-Mysql_python交互

Mysql_python交互
  • Python 中操作DB的步骤
  • 使用PyMysql的步骤
    • 引入模块
      • from pymysql import *
    • 创建Connection 对象
      • 作用:调用connect()方法,创建连接对象,用于建立与数据库的连接
      • 格式:con=connect(参数列表)
      • con = connect(host=host, port=3306, db='test', user='py', password=pwd, charset='utf8')
        • 参数host:连接的mysql主机,如果本机是'localhost'
        • 参数port:连接的mysql主机的端口,默认是3306
        • 参数database/db:数据库的名称 两者等价
        • 参数user:连接的用户名
        • 参数password:连接的密码
        • 参数charset:通信采用的编码方式,推荐使用utf8, 默认不是utf8编码
      • con对象的方法:
        • close()关闭连接
        • commit()提交 connect默认是不自动提交事务的
        • cursor()返回Cursor对象,用于执行sql语句并获得结果
    • 创建Cursor对象
      • 作用:用于执行sql语句,使用频度最高的语句为select、insert、update、delete,需要主要cursor对象不线程安全的,如果用多线程来同时操作多个cursor对象会造成资源竞争,产生阻塞;
      • 获取格式:cur = con.cursor()
      • Cursor对象的方法:
        • close()关闭
        • execute(operation ,[ parameters(默认为空) ])执行语句,返回受影响的行数,主要用于执行insert、update、delete    (返回值是影响的行数)
        • 语句,也可以执行create、alter、drop等语句
        • fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
        • fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
      • Cursor对象的属性
        • rowcount只读属性,表示最近一次execute()执行后受影响的行数
        • connection获得当前连接对象
    • 执行mysql语句
      • cur.execute(operation ,[ parameters(默认为空) ])
        • openration 为执行语句, parameters为语句所需要的参数;
        • 注意:
          • execute参数化数据时 只支持%s的数据  如果占位符有%d 则会解析出错,所以在使用excute的时候都要用字符串来占位。当使用参数化的时候,用%s来站位,当不使用参数化的时候用‘%s’来占位;
        • 例子:
          • sql = "select * from user_info where user_name='%s' and user_pass='%s'" % (uname, upass)
          • row_count = cur.execute(sql)
    • 提交操作
      • con.commit()  不提交会默认rollback
    • 关闭Cursor对象,关闭Connection对象
      • close()
SQL注入问题
  • 什么是SQL注入问题:
    • SQL语句的字符串直接拼接会引起SQL注入等安全问题。
  • 会产生SQL问的的情景
    • 产生问题原因:
      • 因为#为注释的意思
      • 当拼接内容为如下的时候,不管用户用户密码输入什么都不需要考虑,都会默认输入有效
        • itheima'#
        • itheima' or 1=1 or '
      • 这样就因为字符创拼接导致了数据库操作的漏洞
  • 解决方法(参数化)
    • sql语句的参数化,可以有效防止sql注入
      • 注意:此处不同于python的字符串格式化,全部使用%s占位
        • 例:
      • 这样excute方法内部会自动对参数进行处理,防止因为字符串拼接造成的问题;
        • 其原理是执行execute的时候在内部调用了mogrify()方法先进行了mogrify转化,再进行语句的execute。



刘小恺(Kyle) wechat
如有疑问可联系博主