pymysql模块

pymysql模块

语法

 1import pymysql
2#链接
3conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
4#游标
5cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
6#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#以字典的显示
7# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
8# cursor.scroll(3,mode='relative') # 相对当前位置移动
9---------------------------------------
10#执行sql语句
11sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
12print(sql)
13res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
14print(res)
15cursor.close()
16conn.close()
17if res:
18 print('登录成功')
19else:
20 print('登录失败')

execute()之sql注入

注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符
根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

1最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了
2#1、sql注入之:用户存在,绕过密码
3egon' -- 任意字符
4#2、sql注入之:用户不存在,绕过用户与密码
5xxx'
or 1=1 -- 任意字符


# 在服务端防止sql注入问题:不要自己拼接字符串,让pymysql模块去拼接

1# 原来是我们对sql进行字符串拼接
2# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
3# print(sql)
4# res=cursor.execute(sql)
5#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
6sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
7res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

增、删、改:conn.commit()

 1import pymysql
2#链接
3conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
4#游标
5cursor=conn.cursor()
6#执行sql语句
7#part1
8# sql='insert into userinfo(name,password) values("root","123456");'
9# res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
10# print(res)
11#part2
12# sql='insert into userinfo(name,password) values(%s,%s);'
13# res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
14# print(res)
15#part3
16sql='insert into userinfo(name,password) values(%s,%s);'
17res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #执行sql语句,返回sql影响成功的行数
18print(res)
19conn.commit() #提交后才发现表中插入记录成功
20cursor.close()
21conn.close()

查:fetchone,fetchmany,fetchall

 1import pymysql
2#链接
3conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
4#游标
5cursor=conn.cursor()
6#执行sql语句
7sql='select * from userinfo;'
8rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
9# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
10# cursor.scroll(3,mode='relative') # 相对当前位置移动
11res1=cursor.fetchone()
12res2=cursor.fetchone()
13res3=cursor.fetchone()
14res4=cursor.fetchmany(2)
15res5=cursor.fetchall()
16print(res1)
17print(res2)
18print(res3)
19print(res4)
20print(res5)
21print('%s rows in set (0.00 sec)' %rows)
22conn.commit() #提交后才发现表中插入记录成功
23cursor.close()
24conn.close()
25'''
26(1, '
root', '123456')
27(2, '
root', '123456')
28(3, '
root', '123456')
29((4, '
root', '123456'), (5, 'root', '123456'))
30((6, '
root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))
31rows in set (0.00 sec)
32

posted @ 2018-05-11 16:01  木夂口  阅读(158)  评论(0编辑  收藏  举报
levels of contents