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()

 

posted @ 2017-09-14 15:24  魅力宁波  阅读(249)  评论(0)    收藏  举报