13-[Mysql]--pymysql模块
1、介绍
之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢?这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装
pip3 install pymysql
import pymysql user = input('user>>>').strip() pwd = input('pwd>>>').strip() # 建立连接 conn = pymysql.connect( host='127.0.0.1', # localhost port=3306, user='root', password='root', db='db10', charset='utf8' ) # 拿到游标 cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示 #cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 以字典显示 # 执行sql语句 sql = "select * from userinfo where username='%s' and password='%s'" % (user, pwd) #注意%s需要加引号 rows = cursor.execute(sql) # 执行sql语句,返回sql查询成功的记录数目 # 关闭游标 cursor.close() # 关闭连接 conn.close() if rows: print('登录成功', rows) else: print('登录失败', rows)
2、execute()之sql注入
(1)原理
注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符
根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'
最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了 #1、sql注入之:用户存在,绕过密码 egon' -- 任意字符 #2、sql注入之:用户不存在,绕过用户与密码 xxx' or 1=1 -- 任意字符
(2)解决方法:
# 原来是我们对sql进行字符串拼接 # sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd) # print(sql) # res=cursor.execute(sql) #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了) sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上 res=cursor.execute(sql,(user,pwd)) # pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
3、 增、删、改:conn.commit()
import pymysql #链接 conn=pymysql.connect(host='localhost',user='root',password='123',database='egon') #游标 cursor=conn.cursor() #part2 sql='insert into userinfo(name,password) values(%s,%s);' res=cursor.execute(sql,("root","123456")) # 增加一条数据 print(res) # 执行sql语句,返回sql影响成功的行数 #part3 res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) # 增加多条数据 print(res) conn.commit() # 提交后才发现表中插入记录成功 cursor.close() conn.close()
# in方法的使用
triggerid = ('10011', '10010')
sql = "select * from triggers where triggerid in %s"
ret = handle.execute(sql, triggerid)
print(ret)
4、查: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,将结果放入一个集合,等待被查询 res1=cursor.fetchone() # 取出第一条data res2=cursor.fetchone() # 取出next数据 res3=cursor.fetchone() res4=cursor.fetchmany(2) # 取出2条数据 res5=cursor.fetchall() # 全部取出来 print(res1) print(res2) print(res3) print(res4) print(res5) print('%s rows in set (0.00 sec)' %rows) cursor.close() conn.close()
5、相对位置,绝对位置,获取插入的最后一条的自增id
import pymysql # 1.建立连接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='root', db='db10', charset='utf8' ) # 2、拿到游标 cursor = conn.cursor(pymysql.cursors.DictCursor) # 以字典形式显示 sql = 'select * from userinfo ' rows = cursor.execute(sql) cursor.scroll(3, mode='absolute') # 绝对位置移动 f.seek print(cursor.fetchmany(2)) # 指定几条数据 # 5.关闭游标 cursor.close() # 6、关闭连接 conn.close()
import pymysql # 1.建立连接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='root', db='db10', charset='utf8' ) # 2、拿到游标 cursor = conn.cursor(pymysql.cursors.DictCursor) # 以字典形式显示 sql = 'select * from userinfo ' rows = cursor.execute(sql) print(cursor.fetchone()) # 打印第1条 cursor.scroll(2, mode='relative') # 相对位置移动2个 print(cursor.fetchone()) # 打印第4条 # 5.关闭游标 cursor.close() # 6、关闭连接 conn.close()
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) print(cursor.lastrowid) # 在插入语句后查看 conn.commit() cursor.close() conn.close()