python模块之pymysql
一、pymysql基本用法
import pymysql conn=pymysql.connect(host='数据库IP',user='数据库用户',password='数据库密码',database='要操作的数据库',charset='utf8') #获取MySQL连接对象 coursor=conn.cursor(cursor=pymysql.cursors.DictCursor) #获取MySQL游标,设置查询结果以字典字段名:字段值的形式显示 sql='要执行的sql语句'
cursor.execute(sql) #执行sql语句,并获得返回结果,返回为成功操作的数据条数
cursor.callproc('p1',args=())#调用存储过程,传入存储过程名,有参数通过args传入,pymysql将参数通过@_存储过程名_索引=参数值保存后将变量名传给存储过程
#ret=cursor.executemany(sql,[('字段值1,字段值2'),('字段值1','字段值2'),.....]) #执行插入操作时同时插入多条数据
conn.commit() #将操作提交到数据库生效 cursor.close() conn.close()
二、sql注入
sql注入是利用mysql关键字--来绕过用户名密码验证登陆到数据库的一种手段,代码如下
xxx' or 1=1 -- 任意字符 #在输入用户名时输入该字符串,利用--注释掉之后的sql语句,同时条件判断中用 or 加一个永远成立的条件值使得判断成立,从而绕过用户名密码验证登陆到数据库中
三、利用pymysql解决sql注入问题
sql="select * from userinfo where name=%s and password=%s" #占位符%s不再用引号包裹 res=cursor.execute(sql,[user,pwd]) #判断的条件值用列表传给pymysql,由它去排除可能是sql注入的一些输入
四、获取查询结果
由于pymysql执行sql语句后的返回值是成功操作的数据条数,我们想获取真正的执行结果需要使用其他方法,分别是fetchone、fetchmany、fetchall,它们的作用为取一条结果,取指定条数的结果,取所有结果,代码如下
import pymysql #链接 conn=pymysql.connect(host='localhost',user='root',password='123',database='egon') #游标 cursor=conn.cursor() #执行sql语句 sql='select * from userinfo;' rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
# 数据被读取后需要移动游标才能重新读取 # cursor.scroll(3,mode='absolute') # 游标移动距离,相对绝对位置移动 # cursor.scroll(3,mode='relative') # 相对当前位置移动 res1=cursor.fetchone() res2=cursor.fetchone() res3=cursor.fetchone() res4=cursor.fetchmany(2) res5=cursor.fetchall() print(res1) print(res2) print(res3) print(res4) print(res5) print('%s rows in set (0.00 sec)' %rows) conn.commit() #提交后才发现表中插入记录成功 cursor.close() conn.close()
五、获取最后插入的最后一条数据的自增id
import pymysql conn=pymysql.connect(host='localhost',user='root',password='123',database='egon') cursor=conn.cursor() sql='insert into userinfo(name,password) values("xxx","123");' rows=cursor.execute(sql) conn.commit() print(cursor.lastrowid) #查看最后一条数据的自增id,在commit之前和之后都可以查看 cursor.close() conn.close()

浙公网安备 33010602011771号