数据库之(4)pymysql 模块
pymysql模块相关方法:
1 import pymysql # python 调用mysql的客户端 2 #连接数据库,connections.Connection.__init__() 3 conn = pymysql.connect( 4 host = '127.0.0.1', 5 port = 3306, 6 user = 'root', 7 password = '', 8 database = 'day45',#数据库名 9 charset = 'utf8', 10 ) 11 cur = conn.cursor()#拿到游标 12 13 # 增删改,写数据库 14 #方式一 15 # sql_info = 'insert into userinfo(name,password) values("%s","%s")'%('egon',123) 16 # cur.execute(sql_info) 17 18 #方式二: 19 # sql_info = 'insert into userinfo(name,password) values(%s,%s);' 20 # ret = cur.execute(sql_info,('wu12',1234)) 21 # print(ret) 22 #方式三 23 # cur.executemany(sql_info,[('egon1',123),('egon2',123)]) 24 25 #查,读数据库 26 # sql_info = 'select * from userinfo;' 27 sql_info = 'select password from userinfo where name = "alex";' 28 rows = cur.execute(sql_info) 29 print(rows)#查到的数据有几行,并非获取的数据本身 30 31 #以元组的形式取出数据 32 print(cur.fetchall()[0][0])#一次取出一块 33 # print(cur.fetchmany(4))#一次取出多个,用户可以指定个数 34 # print(cur.fetchall())#把剩下的所有取出来 35 36 conn.commit()#事务型的表的存储方式,必须commit 37 38 cur.close()#关闭游标 39 40 conn.close()#关闭连接
方法:
1 1 cur.execute()#只能传递一组参数 2 2 cur.executemany()#以列表形式传递多组参数 3 3 cur.fetchone()#获取一个查询结果 4 4 cur.fetchmany()#获取多个查询结果 5 5 cur.fetchall()#获取所有的查询结果
cur = conn.cursor()#获取游标,等同于shell里的mysql>

2.excute()之SQL注入

原理:利用某些特殊符号在SQL里具有特殊的意义
1.利用‘--’在mysql中注释的特殊意义
1 import pymysql 2 3 4 name = input('name>>>').strip() 5 password = input('password>>>').strip() 6 conn = pymysql.connect( 7 host = '127.0.0.1', 8 port = 3306, 9 user = 'root', 10 password = '', 11 database = 'day45', 12 charset = 'utf8', 13 ) 14 15 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示 16 cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#执行结果默认以字典的形式显示 17 18 ####sql注入漏洞 19 # 漏洞一:alex" -- aaa 20 # 漏洞二:aaa " or 1=1 -- aaa 21 sql = 'select * from userinfo where name = "%s" password = "%s" ;'%(name,password) 22 print(sql) 23 ret = cur.execute(sql) 24 25 conn.commit() 26 cur.close() 27 conn.close() 28 29 if ret: 30 print('登录成功') 31 else: 32 print('登录失败')
# 漏洞一:alex" -- aaa
执行结果:

# 漏洞二:aaa " or 1=1 -- aaa
执行结果:

解决手段:
1.前端限制:要求用户不能够输入具有特殊意义的符号
2.后台:有的数据不是通过前端传递过来,需要程序员控制,即是通过正则表达式等手段,提取出具有特殊符号的内容,让该SQL语句不要执行。
3.查询语句
绝对位移执行结果
1 import pymysql 2 3 4 conn = pymysql.connect( 5 host = '127.0.0.1', 6 port = 3306, 7 user = 'root', 8 password = '', 9 database = 'day45', 10 charset = 'utf8', 11 ) 12 13 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示 14 cur = conn.cursor(cursor=pymysql.cursors.DictCursor) 15 16 ####查询: 17 sql = 'select * from userinfo' 18 cur.execute(sql) 19 20 print(cur.fetchone())#1 21 cur.scroll(2,mode='absolute')# 相对绝对位置移动 22 print(cur.fetchone())#3 23 cur.scroll(2,mode='absolute')# 相对绝对位置移动 24 print(cur.fetchone())#3 25 26 27 28 # print(cur.fetchmany())#字典在列表中 29 # print(cur.fetchall())#字典在列表中 30 31 conn.commit() 32 cur.close() 33 conn.close()
执行结果:

相对位移执行结果:
1 import pymysql 2 3 4 conn = pymysql.connect( 5 host = '127.0.0.1', 6 port = 3306, 7 user = 'root', 8 password = '', 9 database = 'day45', 10 charset = 'utf8', 11 ) 12 13 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示 14 cur = conn.cursor(cursor=pymysql.cursors.DictCursor) 15 16 ####查询: 17 sql = 'select * from userinfo' 18 cur.execute(sql) 19 20 print(cur.fetchone())#1 21 # cur.scroll移动游标位置 22 cur.scroll(2,mode='relative')# 相对当前位置移动 23 print(cur.fetchone())#4 24 cur.scroll(2,mode='relative')# 相对当前位置移动 25 print(cur.fetchone())#7 26 27 28 29 # print(cur.fetchmany())#字典在列表中 30 # print(cur.fetchall())#字典在列表中 31 32 33 # cur.execute('insert into userinfo(name,password) values ("alex2","3714")') 34 # print(cur.lastrowid)#必须要在插入一条语句后,才能够查看自增id增加到什么位置 35 36 conn.commit() 37 cur.close() 38 conn.close()
执行结果:

4.获取插入数据的最后一条的自增id
#cur.lastrowid 必须在插入语句后,执行
1 import pymysql 2 3 4 conn = pymysql.connect( 5 host = '127.0.0.1', 6 port = 3306, 7 user = 'root', 8 password = '', 9 database = 'day45', 10 charset = 'utf8', 11 ) 12 13 # cur = conn.cursor()#执行完毕返回的结果集默认以元组显示 14 cur = conn.cursor(cursor=pymysql.cursors.DictCursor) 15 16 17 cur.execute('insert into userinfo(name,password) values ("alex3","3714")') 18 #必须在插入语句后,执行 19 print(cur.lastrowid)#必须要在插入一条语句后,才能够查看自增id增加到什么位置 20 21 conn.commit() 22 cur.close() 23 conn.close()

浙公网安备 33010602011771号