MySQL与python交互 #SQL注入与防范 #增删改查 #第四部分

呼,终于来到这了。SQL语句已经学会了。接下来就是两件事,用python当客户端。练习练习再练习。
本文需要一个数据库,创建方法请看→创建一个电商数据库

一、原理

在这里插入图片描述

二、安装与连接

1)安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql

2)连接

#导入模块
from pymysql import connect

#连接服务器
conn = connect(user = '用户名',password = '密码',
host = 'localhost',port = 3306,
database = 'shop',charset = 'utf8',
use_unicode = True)
c = conn.cursor('查询的sql语句')#连接游标
…………#这里放主体语句
c.close()#先关闭游标
conn.close()#再关闭连接
  1. conn: 调用了connect(),发送了一系列参数。包括用户名,密码等。从而连接上数据库。
  2. **host:**localhost表示是本地服务器,等同于127.0.0.1。可以在终端用ping localhost 查看是否能够连接。
    在这里插入图片描述
  3. port: 3306表示程序端口。pymysql下,这个需要用int类。如果是mysql.connector,则可用int也可用str。
  4. **database:**打开哪个数据库。
  5. **charset = ‘utf8’**指定编码为utf-8(别老换编码,易报错);
  6. use_unicode = True 假如mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码,那么添加这个会有两个好处:
     一是存数据时:数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
     二是取数据时:在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
       上面的不理解没关系,每次写时,复制黏贴就好。

三、查询&游标是什么

  1. 将上面省略号上面的部分,黏贴入python终端执行
    在这里插入图片描述
  2. 发送sql语句,调用游标的execute()方法

c.execute(‘select * from goods;’)
#返回了?15!这个15是什么意思?其实是可操作记录的行数。但是,查询到的数据,确实放到了游标里。这样看来,游标类似一个盒子,拿到的数据放盒子里,返回值是数据的条数。
#execute方法可以发送SQL语句。像增删改之类的,不需要查看,有它就够了。可是查询是需要显示出来的,显示有三个方法:fetchone(),fetchmany()和fetchall()。

  1. 显示查询结果的fetchone()方法

c.fetchone()
#它一次只显示一条记录,返回的是元组。直到把游标掏空,返回空元组(,)。
在这里插入图片描述

  1. 显示查询结果的fetchmany()方法

c.fetchmany(5)
#返回的是一个元组,里面每一个元素都是元组。里面的数字,表示展示记录个数。没有数字时,返回一个元组((元素),)。没有元素时,返回一个空元组((,),)
在这里插入图片描述

  1. 显示查询结果的fetchall()方法

c.fetchall()
#返回一个嵌套元组,展示所有记录,一下就把游标掏空。
在这里插入图片描述

四、增删改

**增删改都有一个共同特点,就是都要动表。所以为了谨慎,模块规定,要有一个确认提交的代码。这个代码就是conn.commit()

1)确认提交

#导入模块
from pymysql import connect

#连接服务器
conn = connect(user = '用户名',password = '密码',
host = 'localhost',port = 3306,
database = 'shop',charset = 'utf8',
use_unicode = True)
c = conn.cursor('增删改的sql语句')#连接游标
…………#这里放主体语句

conn.commit()#确认提交<==================================
c.close()#先关闭游标
conn.close()#再关闭连接
  1. 在python终端输入

c.execute(‘insert into cates(name) values(‘原子交换机’);’)
#返回1,说明执行成功
#在mysql终端查看
在这里插入图片描述
#会发现,并没有这条记录。但是如果你用select create table cates;可以看到,id更新了!那么有两个问题。为什么没有记录,为什么ID更新了。
#只要写了语句id就会递增(为了防止高并发时,出错),但是没有提交,就不改变表。

在python终端输入conn = commit()
在这里插入图片描述
可以看到,id=11是为其保留的,就等提交了。

2)反悔怎么办

在这里插入图片描述

  • 乖乖,提交一定会出错的,怎么办?滚(roll)回去(back)

conn.rollback()

在这里插入图片描述
在这里插入图片描述

五、SQL注入

SQL注入,就是通过在表单等地方,写入sql语句,从而达到查询修改的目的

from pymysql import connect

conn = connect(user = '',password = '',
    host = 'localhost',port = 3306,
    database = 'shop',use_unicode = True)

c = conn.cursor()
sql_string = input('请输入你要查询的商品名')
sql = "select * from goods where name='%s';"%sql_string
print('--------------->%s<-------------'%sql)
c.execute(sql)
print(c.fetchall())#这个是返回值,所以要打印,才能展示

c.close()
conn.close()
  1. 我们正常的输入一个 对着干笔记本电脑 ,看看发生什么

在这里插入图片描述

  1. 我们使用SQL注入(注意看SQL语句,输入的东西)
    非法获取、出售公民信息超过50条,将入罪。

输入了: ’ or true or '1使得SQL语句相当于select * from goods;
在这里插入图片描述

  1. 如何防范sql注入?

#把上面sql语句,和c.execute()给改为
sql = ‘select * from goods where name=%s;’
c.execute(sql,[sql_string])
#这里利用了python自带的方法,有几个%s,它就获取几个列表里的内容。再次输入’ or true or '1,它里面的%s会被换成第一个空格前的 ’ ,从而返回空元组。内涵就是不要自己去拼SQL

  • 最终代码如下
from pymysql import connect

conn = connect(user = '',password = '',
    host = 'localhost',port = 3306,
    database = 'shop',use_unicode = True)

c = conn.cursor()
sql_string = input('请输入你要查询的商品名')
sql = 'select * from goods where name=%s;'
c.execute(sql,[sql_string])
print(c.fetchall())

c.close()
conn.close()

发布了48 篇原创文章 · 获赞 30 · 访问量 4670

猜你喜欢

转载自blog.csdn.net/weixin_44925501/article/details/102766433