MySql - pymysql 的使用
主要内容:
- 1.pymysql的下载和使用
- 2.excute() 中sql 注入
- 3.cursor
- 4.增 删 改 操作
- 5. 查
1.pymysql 的下载和使用
pymysql模块,该模块本质就是一个套接字客户端软件,通过 pymysql模块 我们就可以在python程序中操作数据库
1.1pymysql 的下载
#在pycharm的 Terminal 中输入指令 pip install pymysql
1.2 pymysql 模块的使用
(1)在数据库中创建一张存用户账号密码的表
mysql> select * from userinfo; +----+------+------+ | id | name | pwd | +----+------+------+ | 1 | alex | 1234 | +----+------+------+
(2)pycharm 代码
#导入pymysql模块 import pymysql username ,password= input ("请输入用户名"),input ("请输入密码") #连接数据库 conn =pymysql.connect( host='127.0.0.1', #这个是ip地址,此处填写的是本机的回环地址(也可以填localhost) user ='root', #数据库用户名 password='', #数据库用户名密码 database ='db10', # 数据库名,该数据库中有存放账号密码的表 port=3306, #端口号 默认3306 charset ='utf8' #编码方式,和数据库编码方式一致 ) #创建游标,用来操作数据库语句 cur = conn.cursor() #数据库语句 (注意此处的%s 需要加'') sql ="select * from userinfo where name='%s' and pwd ='%s'" % (username,password) #执行sql语句 result =cur.execute(sql) #关闭光标 cur.close() if result: print('登录成功') else: print("登录失败")
2.excute() 中sql 注入
2.1注入现象
最后那一个空格,在一条sql语句中如果遇到 select * from userinfo where username='alex' -- asadasdas' and pwd='' 则--之后的条件被注释掉了(注意--后面还有一个空格) #1、sql注入之:用户存在,绕过密码 alex' -- 任意字符 #2、sql注入之:用户不存在,绕过用户与密码 xxx' or 1=1 -- 任意字符
2.2 解决
# 原来是我们对sql进行字符串拼接 # sql="select * from userinfo where name='%s' and pwd='%s'" %(username,password) # result=cursor.execute(sql) #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了) #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上 sql="select * from userinfo where name=%s and password=%s" #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。 #当execute中列表和密码是按列表方式传入 result=cur.execute(sql,[user,pwd]) #此时得到的结果是元祖 sql="select * from userinfo where name=%(name)s and password=%(password)s" result=cur.execute(sql,{"name":username,"password":pwd}) #此时输出结果为字典形式
3. cursor对象
Cursor对象
就是对数据库进行具体的操作了,比如增、删、改、查等等一系列操作都可以完成
类型 | 描述 |
Cursor | 普通的游标对象,默认创建的游标对象 |
SSCursor | 不缓存游标,主要用于当操作需要返回大量数据的时候 |
DictCursor | 以字典的形式返回操作结果 |
SSDictCursor | 不缓存游标,将结果以字典的相识进行返回 |
注:不缓存游标的特点是:根据需要获取行,不是将所有的数据都复制到缓冲区。这样做的好处是:客户端使用更少的内存,并且当网速慢时或者结果集非常大时,返回行的速度要快得多
4.增 删 改 操作
5.查
#获取下一行数据,第一次为首行; etchone(): #获取所有行数据源 fetchall(): #获取4行数据 fetchmany(4):
默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:
#在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
移动指针:
# 相对当前位置移动 cursor.scroll(1,mode='relative') # 相对绝对位置移动 cursor.scroll(2,mode='absolute') #第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动