MySql

主要内容:

  • 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指定了是相对当前位置移动,还是相对于首行移动
原文地址:https://www.cnblogs.com/wcx666/p/10009767.html