2020/01/30 04-Pymysql使用

在这里插入图片描述
mysql基于TCP协议上开发,但是数据库链接后,传输的数据必须是遵照mysql协议。我操作起来,一般通过官方提供的编程接口

mysql connector支持多种语言链接
MySQLdb是python的一个库,到了3.0不继续开发了
pymysql现在支持比较广泛,兼容mysqldb

在这里插入图片描述在这里插入图片描述
首先需要基于tcp编程,创建链接,发送心跳包之类的,你发的结果集,对方需要解析,数据库写的sql语句并不在客户端做任何校验,连接到对方需要connection
在这里插入图片描述
在这里插入图片描述
查看源码connect
在这里插入图片描述
调用pymysql的connect实际上调用的是connect函数在这里插入图片描述在这里插入图片描述
这些就是帮助,host主机,ip,用户,密码,端口在这里插入图片描述在这里插入图片描述host主机,ip,用户,密码,端口
ping方法一旦失败,则直接抛出异常

在这里插入图片描述
ping其实没有返回值,返回值是none,reconnect是重新链接
在这里插入图片描述
一旦重连,就编程false,不然是反复重连 在这里插入图片描述
重连失败就抛出异常
在这里插入图片描述
现在测试user表

在这里插入图片描述
现在自增是3在这里插入图片描述

在这里插入图片描述
游标是对数据集进行操作,数据集就需要有sql语句

在这里插入图片描述
操作数据库就是调用execute()方法,执行sql语句
在这里插入图片描述
cursor会创建一个cursor对象
外面一般双引号,里面用单引号
在这里插入图片描述
现在可以执行sql,execute,操作完sql后,不用也需要关闭close()
在这里插入图片描述
运行一下
在这里插入图片描述
因为代码里没有提交,需要强制刷新一下
在这里插入图片描述
递增就变成4 了
在这里插入图片描述
但是数据确实没进来,因为现在还没对数据库进行提交,所以刚才的事务改变不作数
在这里插入图片描述
再次执行
在这里插入图片描述
但是3跳过去了在这里插入图片描述在这里插入图片描述
就算删除一行,主键也是在最大值递增的,所以主键可以不连续

现在是唯一键出现问题,loginname不允许冲突
在这里插入图片描述
再次执行一遍在这里插入图片描述在这里插入图片描述
现在插入这个数据
在这里插入图片描述
但凡保存下来,主键就变成了101,主键自增的情况下也可以自己往里面塞ID在这里插入图片描述
所以插入数据有可能失败,就需要用到try,你打开的资源就需要关闭
在这里插入图片描述
链接的时候也可能出现问题,也可以用try
在这里插入图片描述
cursor也是一样的,会出问题
在这里插入图片描述
现在试试查询,纯查询不会对表数据进行影响,一般不做事务提交和回滚,但游标还是一种资源,该关闭还是需要关闭。游标的真正作用是对结果集进行处理

在这里插入图片描述

执行返回的结果告诉你,只是成功影响了几行
在这里插入图片描述
这时候还需要用cursor,对结果集进行处理,返回的是一个tuple,元组
在这里插入图片描述
拿一行,这个游标就动了一下,指向 了第二行的tom1在这里插入图片描述在这里插入图片描述
还提供了fetchmany(参数)
在这里插入图片描述
用一个容器把这两行装在一起,2表示,再拿两个,用容器把这个两行装起来了在这里插入图片描述
试试fetchall
在这里插入图片描述
cursor是管结果集的,数据并不能从exectute里拿到,需要借助fetch系列的函数,
fetchone拿一个
fetchmany,指定拿几个
fetchall,拿所有
大多数情况下都用fetchall,结果如果太多用limit(sql语句控制),这里的fetch说明结果已经从服务器端查好之后,形成一个结果,把这个结果通过链接推送到客户端了,这样耗费了很多资源
所以select语句查询的时候建议加where和limit,查询是最容易出现效率低下的地方

游标到头,处理完了在这里插入图片描述
可以用fetchall把数据拿到了,想怎么迭代就怎么迭代

现在拿到的数据没有字段名
在这里插入图片描述
查看cursor里面的源码调用
因为链接只管链接,数据集操作还需要找cursor
在这里插入图片描述在这里插入图片描述
如果cursor等于none就返回,self.cursorclass(self)实例化在这里插入图片描述
cursorclass用这个变量
在这里插入图片描述
这个缺省值是一个类,autocommit=false,不会自动提交,一般都是手动提交,因为由你判断此次操作是否成功,如果成功就commit,失败就回滚,所以要写try语句
在这里插入图片描述在这里插入图片描述
cursor类里面还管理一个链接在这里插入图片描述
还有一个mixin类,支持dict字典
在这里插入图片描述
传进来的如果是不是none,就需要初始化构造,里面只需要类在这里插入图片描述在这里插入图片描述
外面列表里面字典,下面需要遍历就很简单,如果不想立即返回结果,就可以使用一个个yield出去,python3鼓励使用生成器在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
一旦出错可以回滚

在这里插入图片描述
在这里插入图片描述
多条sql语句必须使用;分号间隔

现在批量插入数据
在这里插入图片描述
现在就有一堆数据
在这里插入图片描述
一般执行顺序,就是建立链接,获取游标,执行sql,提交事务,释放资源
在这里插入图片描述在这里插入图片描述在这里插入图片描述
带列名查询需要用到DictCursor,mixin的子类
在这里插入图片描述

sql 注入攻击

在这里插入图片描述
这样就能看到所有的数据,是很危险的在这里插入图片描述
现在查询的就是id=1,没有问题在这里插入图片描述
这样查本来是查不到数据的,关键是pwd如果没有做特殊处理
在这里插入图片描述
这样就凑成了,or后面恒等就把所有的用户名和密码都取出来了
在这里插入图片描述
客户端无论进行什么样的尝试,都不要告诉对和错,得到的信息最少最安全,sql注入攻击最常用的就是登录这块,所有注入攻击解决方案都一样,是参数化查询在这里插入图片描述在这里插入图片描述
使用这种参数化查询
在这里插入图片描述在这里插入图片描述
现在这样参数化可以查询出来
在这里插入图片描述
现在改成参数化查询,能查是能查,把原有东西非法的部分截断了,原有sql语句 空格就是间隔,所以通过参数化查询,就可以解决注入攻击在这里插入图片描述
参数化查询还能解决批量查询的问题

循环起来,缺的参数从下面拿在这里插入图片描述
现在就有数据了
在这里插入图片描述
查看是如何实现的
在这里插入图片描述
每一次迭代生成一个数据
在这里插入图片描述
之前是把参数凑成一条语句,到上面把语句一句句执行
在这里插入图片描述
所以还是可迭代对象迭代了,也是挨个一个个执行
在这里插入图片描述
参数化查询可以有效解决sql注入攻击的问题,参数化查询可以进行sql语句的缓存,数据库服务器,会让sql语句进行缓存,编译只对sql语句进行编译和缓存。
编译过程,需要词法分析,语法分析,生成AST抽象语法树,用抽象语法书再进行优化,生成执行计划等过程,所有的编译环节都需要做这个事情,编译的过程是比较耗费计算机资源的
参数化查询,只要传入的参数一样,如果有缓存可以在数据库服务器里的缓存能找到,就可以直接用缓存,(缓存的是语句,不是结果)
但是一般性能少还是比较趋向于sql语句的写法问题

在这里插入图片描述在这里插入图片描述在这里插入图片描述
现在
需要有上下文管理这些资源,比如游标,链接,
这样cursor可以拿来直接用

在这里插入图片描述
conn的exit里面没有关注cursor,离开的时候没有管
在这里插入图片描述
所以离开的时候cursor主动关闭一下,cursor一旦关闭就不能使用 了
在这里插入图片描述在这里插入图片描述
先关闭了但是还可以使用指针,cursor关闭是把链接一下关闭。但是数据集没有
在这里插入图片描述
后面再执行查询,就排除异常在这里插入图片描述
执行一次拿到结果,还可以再次执行,再拿到结果,使用cursor可以反复操作数据库,用完记得关闭在这里插入图片描述
cursor有打开,有关闭,试试是否可以用with,查看源码
在这里插入图片描述
退出时,删除所有异常,把自己关闭,
在这里插入图片描述
链接不会关闭自己,只会提交和回滚,链接在进入的时候会返回cursor给你使用,cursor用with进入enter,返回自己,等于什么都没做。,离开cursor一定会保证当前cursor的close
在这里插入图片描述
链接的enter是返回的一个cursor对象,退出的时候做一些判断,失败回滚
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
把这一段代码写到try语句块,finally,conn。close,一定保证close一定关闭,因为cursor没有在with语法退出的时候关闭,需要手动关闭,保证关闭就需要try在这里插入图片描述
pymysql是数据库访问的基础,效率不

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值