![131c0b763246b47190b6e61f6c258b2c.png](https://img-blog.csdnimg.cn/img_convert/131c0b763246b47190b6e61f6c258b2c.png)
第七章 保存数据
7.1 pickle
![16f74805f833f25df5c9771bf6844c4d.png](https://img-blog.csdnimg.cn/img_convert/16f74805f833f25df5c9771bf6844c4d.png)
用pickle.dump(integers, f)将数据integers保存到文件22901.dat中。
pickle.dump(obj,file[,protocol]):
obj:序列化对象,它是基本类型,也可以是序列化自己定义的类型。
file:要写入的文件,可以广泛地理解为write()方法的对象,并且能接受字符串为参数。
protocol:可选项,默认为False,默认情况下是以ASCII码形式进行保存,如果为TRUE,则为二进制的形式进行保存。
![6584be7fb64848ecfcde8349b5c2f5d7.png](https://img-blog.csdnimg.cn/img_convert/6584be7fb64848ecfcde8349b5c2f5d7.png)
分别以二进制的形式和ASCII码的形式保存对象,其大小是不一样的,二进制的的形式比较小一些,而且大约是ASCII码的43%
![f6ca17a62b3e63dd96479f86477cb141.png](https://img-blog.csdnimg.cn/img_convert/f6ca17a62b3e63dd96479f86477cb141.png)
存入文件被称之为序列化,将文件读取出来被称之为反序列化。
7.2 shelve
略
7.3 MySQL数据库
数据库是指以一定方式储存在一起,能为多个用户共享,具有尽可能小的冗余度,与应用程序彼此独立的数据集合。
7.3.1 MySQL概况
7.3.2 安装
(我用的是阿里云服务器,与书上说明不太一致)
首先更新一下:
![dec2485c9b57884f140c8b5ab2a602e8.png](https://img-blog.csdnimg.cn/img_convert/dec2485c9b57884f140c8b5ab2a602e8.png)
然后安装mysql数据库:
![8de4034c651e74ca157afe80e41af371.png](https://img-blog.csdnimg.cn/img_convert/8de4034c651e74ca157afe80e41af371.png)
安装完之后重启一下:
![868c895f18da1dffecdf9ad01a5915c6.png](https://img-blog.csdnimg.cn/img_convert/868c895f18da1dffecdf9ad01a5915c6.png)
输入指令查看是否安装成功:
![eff01da1661fe7305378da39aaedcf28.png](https://img-blog.csdnimg.cn/img_convert/eff01da1661fe7305378da39aaedcf28.png)
重新设置密码(注意句末的分号):
![b98706e0410bea165623a576c5fd6d83.png](https://img-blog.csdnimg.cn/img_convert/b98706e0410bea165623a576c5fd6d83.png)
7.3.3 运行
![ae2d926382a85a1bb278aaa9098e80b4.png](https://img-blog.csdnimg.cn/img_convert/ae2d926382a85a1bb278aaa9098e80b4.png)
查看数据库:
![b26eecc2a0faa3e67a15fb0fe253bc6e.png](https://img-blog.csdnimg.cn/img_convert/b26eecc2a0faa3e67a15fb0fe253bc6e.png)
7.3.4 安装python-MySQLdb
在编程中会遇到很多类似的接口程序,通过接口程序对另外一个对象进行操作。python-MySQLdb就是打开MySQL数据库的钥匙。引入这个模块,就可以在python中操作MySQL。
首先安装:pip install mysql - python
然后import MySQLdb,如果没有报错,则安装成功。
7.3.5 连接数据库
创建数据库:
![d01b038230645490fa7f9e0e2d630cdf.png](https://img-blog.csdnimg.cn/img_convert/d01b038230645490fa7f9e0e2d630cdf.png)
在python中创建MySQLdb对象用来连接数据库:
![a119df1b7feabac90820045295461d29.png](https://img-blog.csdnimg.cn/img_convert/a119df1b7feabac90820045295461d29.png)
host:填写的是数据库的地址,因为数据库在本机上,所以写的是localhost,如果不是本机,则要写其他服务器的IP。注意要带引号。
user:登陆用户名,注意要带引号。
passwd:登陆密码,注意要带引号。
db:要连接的数据库名称,注意要带引号。
port:MySQL端口号,一般默认为3306。注意不带引号,该函数中唯一一个整除参数,其他都是字符串。
charset:设置格式,utf8,注意要带引号。
至此已经完成了数据库的连接
7.3.6 数据库表
查看数据库中的表:
![80304e2de1ee072a8e892418c53b10d0.png](https://img-blog.csdnimg.cn/img_convert/80304e2de1ee072a8e892418c53b10d0.png)
在数据库中创建一个表:
![708fd31717ac184aa03fbd439f2581f9.png](https://img-blog.csdnimg.cn/img_convert/708fd31717ac184aa03fbd439f2581f9.png)
插入信息:
![dc411633f20efb872dfbc32116f63bd6.png](https://img-blog.csdnimg.cn/img_convert/dc411633f20efb872dfbc32116f63bd6.png)
7.3.7 操作数据库
创建一个MySQLdb。connect()对象来连接数据库(记得先import MySQLdb):
![217a2b599e211bde3acdc355853bca0f.png](https://img-blog.csdnimg.cn/img_convert/217a2b599e211bde3acdc355853bca0f.png)
commit():用于在python中操作数据库之后提交更改的数据,有了这一步才能在MySQL数据库中更新。
rollback():如果有权限,取消当前操作。
close():关闭连接,关闭游标。
cursor():返回游标对象。
python中操作MySQL,就要先建立连接,然后再创建游标对象:
![fc44e0955734733ee610571016a65c77.png](https://img-blog.csdnimg.cn/img_convert/fc44e0955734733ee610571016a65c77.png)
1、插入:
![3352fccd04db9e8c869834d9522fac40.png](https://img-blog.csdnimg.cn/img_convert/3352fccd04db9e8c869834d9522fac40.png)
execute(query[,args])是执行MySQL语句的函数,其中query是MySQL语句,args是MySQL语句参数。
执行成功之后返回1L,说明一条语句已经插入,但是此时在MySQL中查看发现该语句并没有执行,是因为还少了一个提交数据:
![fc66cf0ea5aafba10a6f7405e34ef791.png](https://img-blog.csdnimg.cn/img_convert/fc66cf0ea5aafba10a6f7405e34ef791.png)
一下插入多行命令:
![ad9cb30c1de2ed69eed197477fc63bc6.png](https://img-blog.csdnimg.cn/img_convert/ad9cb30c1de2ed69eed197477fc63bc6.png)
注意,特别注意括号——一环套一环的括号,这个元组里面的元素也是元组,每个元组分别对应sql语句中的字段列表
2、查询
![b7465cba8732f93386623b0d1fcd9a9b.png](https://img-blog.csdnimg.cn/img_convert/b7465cba8732f93386623b0d1fcd9a9b.png)
显示11L.说明查询到11条数据。然后我们可以用游标对象的fetchall()、fetchone()、fetchmany(size = None)来打印出查询结果:
![7943cc6efff7bfa83d9273cd6803451b.png](https://img-blog.csdnimg.cn/img_convert/7943cc6efff7bfa83d9273cd6803451b.png)
cur.execute()从数据库查询出来的东西,被“保存在了cur所能找到的某个地方”,要找出这些被保存的东西,需要用cur.fetchall()(或者fechone等),并且找出来之后,作为对象存在。而且是一个元组对象,里面的元素也是一个一个的元组。
游标读取的时候,在第一次操作cur.fetchall()时就会从第一条数据移动到最后一条数据。
![ff2e73318f1766118349ae0bd010c299.png](https://img-blog.csdnimg.cn/img_convert/ff2e73318f1766118349ae0bd010c299.png)
上面是将游标向上移动到两条数据之前。括号里的数为正,则表示向下移动,反之为向上移动。且均是相对于当前的游标位置进行移动。
![8ed6b15fb2d9011067a1b45579d22e62.png](https://img-blog.csdnimg.cn/img_convert/8ed6b15fb2d9011067a1b45579d22e62.png)
这样就是将游标进行绝对移动,注意python中排序的第一位是0,所以括号内是2,其实是指向第三条
在连接对象的游标方法中提供了一个参数,可以实现将读取到的数据变成字典形式:
![738d53b3cfdb5959ca3f76b69cd58406.png](https://img-blog.csdnimg.cn/img_convert/738d53b3cfdb5959ca3f76b69cd58406.png)
这样,就可以按照字典进行操作:
![03f8ba4094c11c050718557af88b748c.png](https://img-blog.csdnimg.cn/img_convert/03f8ba4094c11c050718557af88b748c.png)
7.3.8 更新数据
每次更新都需要commit()这个函数进行保存。
且记住,在操作完毕数据一定要有(以本文对象为例):cur.close()和conn.close()
![580763fa947a78d93cff1ba5f76dbc03.png](https://img-blog.csdnimg.cn/img_convert/580763fa947a78d93cff1ba5f76dbc03.png)