我们自己开发测试时,可以使用该可视化工具,以图形界面的形式操作数据库
在生产环境中,为了显示自己的逼格,一般不建议使用它
pipinstallpymysql2.2链接,执行sql以及关闭游标这是我在test库下创建的ttt表格
importpymysqluser=input('username:').strip()pwd=input('password:').strip()#链接conn=pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')#创建游标对象cursor=conn.cursor()#执行mysql语句sql='select*fromtttwherename="%s"andpassword="%s"'%(user,pwd)print(sql)#执行sql语句,返回sql查询成功的记录数目,输入错误则是0,正确输出1result=cursor.execute(sql)print(result)cursor.close()conn.close()类似结果
看看下面两种输入方式(注意输入的是单引号还是双引号,另--后面还有空格,否则输出是0)
在用户名输入正确的情况下绕过密码(bob"--任意字符)
直接绕过用户名和密码访问(xxx'or1=1--任意字符)
造成上面结果的原理:
就根据程序的字符串拼接name='%s',我们输入一个xxx"--haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx'--haha'
解决办法:
核心就是不使用字符串拼接方方式去访问就ok,下面是修改的代码
importpymysqluser=input('username:').strip()pwd=input('password:').strip()#链接conn=pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')#创建游标对象cursor=conn.cursor()#执行mysql语句,这里两个%不需要加上引号,mysql会默认给加上,另外pymysql模块自动帮我们#将uer和pwd注入,所以下面括号内的内容必不可少(也可以是列表),它其实间接的和字符串拼接是一个道理sql="select*fromtttwherename=%sandpassword=%s"print(sql)#这步没啥意义,就是让你看看结果res=cursor.execute(sql,(user,pwd))print(res)cursor.close()conn.close()结果
这里一定要有execute执行和commit提交这几步
importpymysql#链接conn=pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')#创建游标对象cursor=conn.cursor()#增一个sql="insertintottt(name,password)values(%s,%s);"res=cursor.execute(sql,('luffy',666))#增多个sql="insertintottt(name,password)values(%s,%s);"res=cursor.executemany(sql,[('qq',454),('ww',574),('ee',322)])#必须放进一个大的列表里#改操作sql="updatetttsetname=%swhereid=4;"cursor.execute(sql,'zoro')#删操作sql="deletefromtttwhereid=2;"cursor.execute(sql)#删除了这步执行语句也得要有conn.commit()#提交语句,必须要有,别忘啊cursor.close()conn.close()2.5查fetchone,fetchmany,fetchall(属于光标操作)fetchone():获取下一行数据,第一次为首行;fetchall():获取所有行数据源fetchmany(4):获取4行数据上面的表经过增删改后:
fetchone()与fetchall()
importpymysql#链接conn=pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')#创建游标对象cursor=conn.cursor()#默认返回元祖形式#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#它返回的是一个字典#查操作,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询sql="select*fromttt;"rows=cursor.execute(sql)#查询单个res1=cursor.fetchone()#查找出id是1的res2=cursor.fetchone()#查找出id是3的print(res1)print(res2)#对rows进行操作,查找所有,注意这里的所有指的是id是3以后的了,光标已经移动了rows=cursor.fetchall()print(rows)conn.commit()#提交语句,必须要有,别忘啊cursor.close()conn.close()注意,当使用fetchone获取数据时,如果光标已经到最后一行,则会返回none,我们可以采用下面方式移动指针
cursor.scroll(1,mode='relative')#相对当前位置移动cursor.scroll(2,mode='absolute')#相对绝对位置移动第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动