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。