8.22MySQL(五)pymysql模块、sql注入问题
一、基本查询语句及方法补充
1.concat_ws
拼接多个
select concat(name,":",age,":",post,":",salary) from emp;
select concat_ws(':',name,age,post,salary) from emp;
上述语句完全等价
2.exist(了解)
EXISTS关字键字表示存在。
在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,True或False。
当返回True时,外层查询语句将进行查询
当返回值为False时,外层查询语句不进行查询。
select * from emp where exists (select id from dep where id > 3); select * from emp where exists (select id from dep where id > 250);
二、pymysql模块
1.安装:pip3 insatll pymysql
2.代码连接
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day38', charset = 'utf8' # 编码千万不要加-,如果写成了utf-8会直接报错 ) cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息 sql = 'select * from teacher' res = cursor.execute(sql) # 执行传入的sql语句 print(res) # res是执行语句返回的数据条数 print(cursor.fetchone()) # 只获取一条数据 print(cursor.fetchall()) # 获取所有的数据,返回的结果是一个列表 cursor.scroll(1,'absolute') # 控制光标移动,absolute相对于起始位置,往后移动几位 cursor.scroll(1,'relative') # relative相对于当前位置,往后移动几位
三、sql注入问题
1.注入问题,错误代码
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day38', charset = 'utf8' # 编码千万不要加-,如果写成了utf-8会直接报错 ) cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息 username = input(">>>:").strip() password = input(">>>:").strip() sql = "select * from user where username='%s' and password='%s'"%(username,password) res = cursor.execute(sql) # 传入执行的语句 # 用户名正确 username >>>: jason' -- jjsakfjjdkjjkjs password >>>: '' # 用户名密码都不对的情况 username >>>: xxx' or 1=1 --asdjkdklqwjdjkjasdljad password >>>: ''
sql注入问题,就是利用注释等具有特殊意义的符号,来完成一些骚操作
后续写sql语句,不要手动拼接关键性的数据
而是让excute帮你去做拼接
2.excute,正确代码
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day38', charset = 'utf8' # 编码千万不要加-,如果写成了utf-8会直接报错 ) cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息 username = input(">>>:").strip() password = input(">>>:").strip() sql = "select * from user where name =%s and password = %s" res = cursor.execute(sql,(username,password)) # 能够帮你自动过滤特殊符号,避免sql注入的问题 # execute能够自动识别sql语句中的%s,帮你做替换 if res: print(cursor.fetchall()) else: print('用户名或密码错误')
四、pymysql增删改
1.增删改(以下增删改操作都不生效)
先代码连接
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day38', charset = 'utf8' # 编码千万不要加-,如果写成了utf-8会直接报错 ) cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息
新增
sql = 'insert into user(name,password) values("jerry","666")' cursor.execute(sql)
修改
sql = 'update user set name = "jasonhs" where id = 1' cursor.execute(sql)
删除
sql = 'delete from user where id = 6' cursor.execute(sql)
以上增删改操作都不生效
2.conn.commit()
增、改和删操作只执行excute并不会真正影响到数据,需要再执行conn.commit()才可以完成真正的增改
1.增删改操作正确写法
# 新增 sql = 'insert into user(name,password) values("jerry","666")' cursor.execute(sql) conn.commit() # 修改 sql = 'update user set name = "jasonhs" where id = 1' cursor.execute(sql) conn.commit() # 删除 sql = 'delete from user where id = 6' cursor.execute(sql) conn.commit()
2.也可以在连接的时候多配一个参数
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day38', charset = 'utf8' # 编码千万不要加-,如果写成了utf-8会直接报错 autocommit = True # 这个参数配置完成后,增删改操作都不需要再手动加conn.commit了 ) cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息 # 新增 sql = 'insert into user(name,password) values("jerry","666")' cursor.execute(sql)