[TOC]
### 引入
程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。
而如何定义数据的存储格式就是一个大问题。如果我们自己来定义存储格式,比如保存一个班级所有学生的成绩单:
|||
|---|---|
|名字| 成绩|
|Michael| 99|
|Bob |85|
|Bart| 59|
|Lisa| 87|
### 文件保存
你可以用一个文本文件保存,一行保存一个学生,用,隔开:
~~~
Michael,99
Bob,85
Bart,59
Lisa,87
~~~
### JSON 保存
你还可以用`JSON`格式保存,也是文本文件:
~~~
[
{"name":"Michael","score":99},
{"name":"Bob","score":85},
{"name":"Bart","score":59},
{"name":"Lisa","score":87}
]
~~~
### 问题
你还可以定义各种保存格式,但是问题来了:
存储和读取需要自己实现,`JSON`还是标准,自己定义的格式就各式各样了;
不能做快速查询,只有把数据全部读到内存中才能自己遍历,但有时候数据的大小远远超过了内存(比如蓝光电影,`40GB`的数据),根本无法全部读入内存。
为了便于程序保存和读取数据,而且,能直接通过条件快速查询到指定的数据,就出现了数据库(`Database`)这种专门用于集中存储和查询的软件。
数据库软件诞生的历史非常久远,早在`1950`年数据库就诞生了。经历了网状数据库,层次数据库,我们现在广泛使用的关系数据库是`20世纪70年代`基于关系模型的基础上诞生的。
### 关系模型
关系模型有一套复杂的数学理论,但是从概念上是十分容易理解的。举个学校的例子:
假设某个`XX`省`YY`市`ZZ`县第一实验小学有`3`个年级,要表示出这`3`个年级,可以在`Excel`中用一个表格画出来:
![image](http://www.liaoxuefeng.com/files/attachments/001398086641919935cabfda92c4152831892dcea5a4fa0000/0)
每个年级又有若干个班级,要把所有班级表示出来,可以在`Excel`中再画一个表格:
![image](http://www.liaoxuefeng.com/files/attachments/001398086656928fdad4552b9364589b2dfdfaf9f37f5af000/0)
这两个表格有个映射关系,就是根据`Grade_ID`可以在班级表中查找到对应的所有班级:
![image](http://www.liaoxuefeng.com/files/attachments/0013980867129633e8a2b06f258435cbf6b585360fe078b000/0)
也就是`Grade`表的每一行对应`Class`表的多行,在关系数据库中,这种基于表(`Table`)的一对多的关系就是关系数据库的基础。
### SQL 语句
根据某个年级的`ID`就可以查找所有班级的行,这种查询语句在关系数据库中称为`SQL`语句,可以写成:
~~~
SELECT * FROM classes WHERE grade_id = '1';
~~~
结果也是一个表:
||||
|---|---|---|
|grade_id | class_id | name|
|1 | 11 | 一年级一班|
|1 | 12 | 一年级二班|
|1 | 13 | 一年级三班|
类似的,`Class`表的一行记录又可以关联到`Student`表的多行记录:
![image](http://www.liaoxuefeng.com/files/attachments/001398086848421dd1e6eefa1284ab3885d219b81da7e13000/0)
由于本教程不涉及到关系数据库的详细内容,如果你想从零学习关系数据库和基本的`SQL`语句,如果你想从零学习关系数据库和基本的`SQL`语句,请自行搜索相关课程。
### NoSQL
你也许还听说过`NoSQL`数据库,很多`NoSQL`宣传其速度和规模远远超过关系数据库,所以很多同学觉得有了`NoSQL`是否就不需要`SQL`了呢?千万不要被他们忽悠了,连`SQL`都不明白怎么可能搞明白`NoSQL`呢?
### 数据库类别
既然我们要使用关系数据库,就必须选择一个关系数据库。目前广泛使用的关系数据库也就这么几种:
付费的商用数据库:
- Oracle,典型的高富帅;
- SQL Server,微软自家产品,Windows定制专款;
- DB2,IBM的产品,听起来挺高端;
- Sybase,曾经跟微软是好基友,后来关系破裂,现在家境惨淡。
这些数据库都是不开源而且付费的,最大的好处是花了钱出了问题可以找厂家解决,不过在`Web`的世界里,常常需要部署成千上万的数据库服务器,当然不能把大把大把的银子扔给厂家,所以,无论是`Google`、`Facebook`,还是国内的`BAT`,无一例外都选择了免费的开源数据库:
- MySQL,大家都在用,一般错不了;
- PostgreSQL,学术气息有点重,其实挺不错,但知名度没有MySQL高;
- sqlite,嵌入式数据库,适合桌面和移动应用。
作为Python开发工程师,选择哪个免费数据库呢?当然是`MySQL`。因为`MySQL`普及率最高,出了错,可以很容易找到解决方法。而且,围绕`MySQL`有一大堆监控和运维的工具,安装和使用很方便。
为了能继续后面的学习,你需要从`MySQL`官方网站下载并安装[MySQL Community Server 5.6](http://dev.mysql.com/downloads/mysql/),这个版本是免费的,其他高级版本是要收钱的(请放心,收钱的功能我们用不上)。
- Python教程
- Python简介
- 安装Python
- Python解释器
- 第一个 Python 程序
- 使用文本编辑器
- Python代码运行助手
- 输入和输出
- 源码
- learning.py
- Python基础
- 数据类型和变量
- 字符串和编码
- 使用list和tuple
- 条件判断
- 循环
- 使用dict和set
- 函数
- 调用函数
- 定义函数
- 函数的参数
- 递归函数
- 高级特性
- 切片
- 迭代
- 列表生成式
- 生成器
- 迭代器
- 函数式编程
- 高阶函数
- map/reduce
- filter
- sorted
- 返回函数
- 匿名函数
- 装饰器
- 偏函数
- Python函数式编程——偏函数(来自博客)
- 模块
- 使用模块
- 安装第三方模块
- 面向对象编程
- 类和实例
- 访问限制
- 继承和多态
- 获取对象信息
- 实例属性和类属性
- 面向对象高级编程
- 使用__slots__
- 使用@property
- 多重继承
- 定制类
- 使用枚举类
- 使用元类
- 错误、调试和测试
- 错误处理
- 调试
- 单元测试
- 文档测试
- IO编程
- 文件读写
- StringIO和BytesIO
- 操作文件和目录
- 序列化
- 进程和线程
- 多进程
- 多线程
- ThreadLocal
- 进程 vs. 线程
- 分布式进程
- 正则表达式
- 常用内建模块
- datetime
- collections
- base64
- struct
- hashlib
- itertools
- contextlib
- XML
- HTMLParser
- urllib
- 常用第三方模块
- PIL
- virtualenv
- 图形界面
- 网络编程
- TCP/IP简介
- TCP编程
- UDP编程
- 电子邮件
- SMTP发送邮件
- POP3收取邮件
- 访问数据库
- 使用SQLite
- 使用MySQL
- 使用SQLAlchemy
- Web开发
- HTTP协议简介
- HTML简介
- WSGI接口
- 使用Web框架
- 使用模板
- 异步IO
- 协程
- asyncio
- async/await
- aiohttp
- 实战
- Day 1 - 搭建开发环境
- Day 2 - 编写Web App骨架
- Day 3 - 编写ORM
- Day 4 - 编写Model
- Day 5 - 编写Web框架
- Day 6 - 编写配置文件
- Day 7 - 编写MVC
- Day 8 - 构建前端
- Day 9 - 编写API
- Day 10 - 用户注册和登录
- Day 11 - 编写日志创建页
- Day 12 - 编写日志列表页
- Day 13 - 提升开发效率
- Day 14 - 完成Web App
- Day 15 - 部署Web App
- Day 16 - 编写移动App
- FAQ
- 期末总结