pymysql模块的使用(增删改查)详解
一、pymysql的下载和使用
之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢?这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装。
(1)pymysql模块的下载
pip3installpymysql
(2)pymysql的使用
#实现:使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中) importpymysql user=input('请输入用户名:') pwd=input('请输入密码:') #1.连接 conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',db='db8',charset='utf8') #2.创建游标 cursor=conn.cursor() #注意%s需要加引号 sql="select*fromuserinfowhereusername='%s'andpwd='%s'"%(user,pwd) print(sql) #3.执行sql语句 cursor.execute(sql) result=cursor.execute(sql)#执行sql语句,返回sql查询成功的记录数目 print(result) #关闭连接,游标和连接都要关闭 cursor.close() conn.close() ifresult: print('登陆成功') else: print('登录失败')
二、execute()之sql注入
最后那一个空格,在一条sql语句中如果遇到select*fromuserinfowhereusername='mjj'--asadasdas'andpwd=''则--之后的条件被注释掉了(注意--后面还有一个空格)
#1、sql注入之:用户存在,绕过密码 mjj'--任意字符 #2、sql注入之:用户不存在,绕过用户与密码 xxx'or1=1--任意字符
解决方法:
#原来是我们对sql进行字符串拼接 #sql="select*fromuserinfowherename='%s'andpassword='%s'"%(username,pwd) #print(sql) #result=cursor.execute(sql) #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了) sql="select*fromuserinfowherename=%sandpassword=%s"#!!!注意%s需要去掉引号,因为pymysql会自动为我们加上 result=cursor.execute(sql,[user,pwd])#pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
三、增、删、改:conn.commit()
commit()方法:在数据库里增、删、改的时候,必须要进行提交,否则插入的数据不生效。
importpymysql username=input('请输入用户名:') pwd=input('请输入密码:') #1.连接 conn=pymysql.connect(host='localhost',port=3306,user='root',password='',db='db8',charset='utf8') #2.创建游标 cursor=conn.cursor() #操作 #增 #sql="insertintouserinfo(username,pwd)values(%s,%s)" #effect_row=cursor.execute(sql,(username,pwd)) #同时插入多条数据 #cursor.executemany(sql,[('李四','110'),('王五','119')]) #print(effect_row)# #改 #sql="updateuserinfosetusername=%swhereid=2" #effect_row=cursor.execute(sql,username) #print(effect_row) #删 sql="deletefromuserinfowhereid=2" effect_row=cursor.execute(sql) print(effect_row) #一定记得commit conn.commit() #4.关闭游标 cursor.close() #5.关闭连接 conn.close()
四、查:fetchone、fetchmany、fetchall
fetchone():获取下一行数据,第一次为首行;
fetchall():获取所有行数据源
fetchmany(4):获取4行数据
查看一下表内容:
mysql>select*fromuserinfo; +----+----------+-----+ |id|username|pwd| +----+----------+-----+ |1|mjj|123| |3|张三|110| |4|李四|119| +----+----------+-----+ rowsinset(0.00sec)
使用fetchone():
importpymysql #1.连接 conn=pymysql.connect(host='localhost',port=3306,user='root',password='',db='db8',charset='utf8') #2.创建游标 cursor=conn.cursor() sql='select*fromuserinfo' cursor.execute(sql) #查询第一行的数据 row=cursor.fetchone() print(row)#(1,'mjj','123') #查询第二行数据 row=cursor.fetchone() print(row)#(3,'张三','110') #4.关闭游标 cursor.close() #5.关闭连接 conn.close()
使用fetchall():
importpymysql #1.连接 conn=pymysql.connect(host='localhost',port=3306,user='root',password='',db='db8',charset='utf8') #2.创建游标 cursor=conn.cursor() sql='select*fromuserinfo' cursor.execute(sql) #获取所有的数据 rows=cursor.fetchall() print(rows) #4.关闭游标 cursor.close() #5.关闭连接 conn.close() #运行结果 ((1,'mjj','123'),(3,'张三','110'),(4,'李四','119'))
默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor
在fetchone示例中,在获取行数据的时候,可以理解开始的时候,有一个行指针指着第一行的上方,获取一行,它就向下移动一行,所以当行指针到最后一行的时候,就不能再获取到行的内容,所以我们可以使用如下方法来移动行指针:
cursor.scroll(1,mode='relative')#相对当前位置移动 cursor.scroll(2,mode='absolute')#相对绝对位置移动
第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动
#1.Python实现用户登录 #2.Mysql保存数据 importpymysql #1.连接 conn=pymysql.connect(host='localhost',port=3306,user='root',password='',db='db8',charset='utf8') #2.创建游标 cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) sql='select*fromuserinfo' cursor.execute(sql) #查询第一行的数据 row=cursor.fetchone() print(row)#(1,'mjj','123') #查询第二行数据 row=cursor.fetchone()#(3,'张三','110') print(row) cursor.scroll(-1,mode='relative')#设置之后,光标相对于当前位置往前移动了一行,所以打印的结果为第二行的数据 row=cursor.fetchone() print(row) cursor.scroll(0,mode='absolute')#设置之后,光标相对于首行没有任何变化,所以打印的结果为第一行数据 row=cursor.fetchone() print(row) #4.关闭游标 cursor.close() #5.关闭连接 conn.close() #结果如下 {'id':1,'username':'mjj','pwd':'123'} {'id':3,'username':'张三','pwd':'110'} {'id':3,'username':'张三','pwd':'110'} {'id':1,'username':'mjj','pwd':'123'}
fetchmany():
importpymysql #1.连接 conn=pymysql.connect(host='localhost',port=3306,user='root',password='',db='db8',charset='utf8') #2.创建游标 cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) sql='select*fromuserinfo' cursor.execute(sql) #获取2条数据 rows=cursor.fetchmany(2) print(rows) #4.关闭游标 #rows=cursor.fetchall() #print(rows) cursor.close() #5.关闭连接 conn.close() #结果如下: [{'id':1,'username':'mjj','pwd':'123'},{'id':3,'username':'张三','pwd':'110'}]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。