python操作MySQL
# 导入第三方模块import pymysql# 链接服务端db = pymysql.connect(host='127.0.0.1', # MySQL服务的IP地址port=3306, # MySQL默认PORT端口号user='root', # 用户名password='', # 密码(简写:passwd)database='test', # 数据库名称(简写:db)charset='utf8' # 字符编码# autocommit=True # 自动二次确认)# 产生获取命令的游标对象cursor = db.cursor(cursor=pymysql.cursors.DictCursor) # 括号内不写参数,数据是元组要元组 不够精确 添加参数则会将数据处理成字典sql = 'show tables'# 执行SQL语句,并返回受影响的行数affect_row = cursor.execute(sql)print(affect_row)# 注意:insert、update、delete 等修改数据的语句需要二次确认conn_obj.commit() # 手动二次确认# 获取SQL语句执行后的结果res = cursor.fetchall()print(res)
查询数据
fetchone():获取查询结果的所有行。将所有行作为元组列表返回。如果没有要获取的记录,则返回一个空列表。fetchmany(size):返回参数指定的行数size。当重复调用时,此方法获取查询结果的下一组行并返回元组列表。如果没有更多行可用,则返回一个空列表fetchall():该方法返回单个行记录,如果没有更多行可用,则返回 None
游标控制
cursor.scroll(1, 'relative'):相对于当前位置游标往后移动一个单位cursor.scroll(1, 'absolute'):相对于起始位置游标往后移动一个单位
事务处理
- 开启事务
db.begin() - 提交修改
db.commit() - 回滚事务
db.rollback()
SQL注入问题
准备数据
create table admin(username varchar(32),password varchar(32));insert into admin (username,password) values('kevin','123');
注入问题
import pymysqldb = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',database='test',charset='utf8')cursor = db.cursor(cursor=pymysql.cursors.DictCursor)username = input("请输入用户名>>>").strip()password = input("请输入密码>>>").strip()sql = "select username,password from admin where username = '%s' and password = '%s'" % (username, password)affect_row = cursor.execute(sql)res = cursor.fetchall()if res:print("登录成功")else:print("用户名或密码错误")
这样会导致如果用户输入' or 1=1 #恶意字符串,拼接在SQL语句也会登录成功
select username,password from admin where username = '' or 1=1 #' and password = ''
解决办法
解决SQL注入的问题其实也很简单就是过滤掉特殊符号,execute方法自带校验SQL注入问题 自动处理特殊符号
ssql = "select username,password from admin where username = %s and password = %s"cursor.execute(sql, (username, password))
补充:以后涉及到敏感数据的拼接全部交给execute方法就好了
