diff --git "a/Day31-35/31-35.\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md" "b/Day31-35/31-35.\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md"
index ea59ac05495750d8b3f3d6265a8bf2f8e36015d6..f0fe19b7cb4b8191bb310ba2850de0d63e8bc3e7 100644
--- "a/Day31-35/31-35.\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md"
+++ "b/Day31-35/31-35.\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md"
@@ -751,7 +751,7 @@ Linux系统的命令通常都是如下所示的格式:
设置hellokitty用户100天后必须修改密码,过期前15天通知该用户,过期后15天禁用该用户。
```Shell
- chage -M 100 -W 15 -I 15 hellokitty
+ chage -M 100 -W 15 -I 7 hellokitty
```
5. 切换用户 - **su**。
diff --git "a/Day36-40/36-38.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" "b/Day36-40/36-38.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md"
index 8b2b48dad8cc988835f42aef8ec1b84d4a27ad34..3500ee47c84b12df9b98a82a6956b64f562a3924 100644
--- "a/Day36-40/36-38.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md"
+++ "b/Day36-40/36-38.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md"
@@ -836,7 +836,7 @@ possible_keys: NULL
在上面的SQL执行计划中,有几项值得我们关注:
-1. type:MySQL在表中找到满足条件的行的方式,也称为访问类型,包括:ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(非唯一索引扫描)、eq_ref(唯一索引扫描)、const/system、NULL。在所有的访问类型中,很显然ALL是性能最差的,它代表了全表扫描是指要扫描表中的每一行才能找到匹配的行。
+1. `type`:MySQL在表中找到满足条件的行的方式,也称为访问类型,包括:ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(非唯一索引扫描)、eq_ref(唯一索引扫描)、const/system、NULL。在所有的访问类型中,很显然ALL是性能最差的,它代表了全表扫描是指要扫描表中的每一行才能找到匹配的行。
2. possible_keys:MySQL可以选择的索引,但是**有可能不会使用**。
3. key:MySQL真正使用的索引。
4. rows:执行查询需要扫描的行数,这是一个**预估值**。
diff --git "a/Day36-40/39-40.NoSQL\345\205\245\351\227\250.md" "b/Day36-40/39-40.NoSQL\346\225\260\346\215\256\345\272\223\345\205\245\351\227\250.md"
similarity index 79%
rename from "Day36-40/39-40.NoSQL\345\205\245\351\227\250.md"
rename to "Day36-40/39-40.NoSQL\346\225\260\346\215\256\345\272\223\345\205\245\351\227\250.md"
index 0b9787804f3413ccc3eb50abd702ec4314badfe4..827c13f413708f6e3f9097965149b79817a34ca8 100644
--- "a/Day36-40/39-40.NoSQL\345\205\245\351\227\250.md"
+++ "b/Day36-40/39-40.NoSQL\346\225\260\346\215\256\345\272\223\345\205\245\351\227\250.md"
@@ -46,27 +46,45 @@ Redis是REmote DIctionary Server的缩写,它是一个用ANSI C编写的高性
#### Redis的安装和配置
-可以使用Linux系统的包管理工具(如yum)来安装Redis,也可以通过在Redis的[官方网站](https://redis.io/)下载Redis的源代码,解压缩解归档之后通过make工具对源代码进行构建并安装,在更新这篇文档时,Redis官方提供的最新稳定版本是[Redis 5.0.4](http://download.redis.io/releases/redis-5.0.4.tar.gz)。
+可以使用Linux系统的包管理工具(如yum)来安装Redis,也可以通过在Redis的[官方网站](https://redis.io/)下载Redis的源代码,解压缩解归档之后通过make工具对源代码进行构建并安装,在更新这篇文档时,Redis官方提供的最新稳定版本是[Redis 5.0.10](https://download.redis.io/releases/redis-5.0.10.tar.gz)。
-```Shell
-wget http://download.redis.io/releases/redis-5.0.4.tar.gz
-gunzip redis-5.0.4.tar.gz
-tar -xvf redis-5.0.4.tar
-cd redis-5.0.4
+下载:
+
+```Bash
+wget https://download.redis.io/releases/redis-5.0.10.tar.gz
+```
+
+解压缩和解归档:
+
+```Bash
+tar -zxf redis-5.0.10.tar.gz
+```
+
+进入Redis源代码目录:
+
+```Bash
+cd redis-5.0.10
+```
+
+构建和安装:
+
+```Bash
make && make install
```
在redis源代码目录下有一个名为redis.conf的配置文件,我们可以先查看一下该文件。
-```Shell
+```Bash
vim redis.conf
```
-配置将Redis服务绑定到指定的IP地址和端口。
+下面我们对Redis的配置文件进行一个扼要的介绍。
+
+配置Redis服务的IP地址和端口:
![](./res/redis-bind-and-port.png)
-配置底层有多少个数据库。
+配置底层有多少个数据库:
![](./res/redis-databases.png)
@@ -76,19 +94,19 @@ vim redis.conf
![](./res/redis-rdb-3.png)
-配置Redis的持久化机制 - AOF。
+配置Redis的持久化机制 - AOF:
![](./res/redis-aof.png)
-配置访问Redis服务器的验证口令。
+配置访问Redis服务器的口令:
![](./res/redis-security.png)
-配置Redis的主从复制,通过主从复制可以实现读写分离。
+配置Redis的主从复制(通过主从复制可以实现读写分离):
![](./res/redis-replication.png)
-配置慢查询。
+配置慢查询:
![](./res/redis-slow-logs.png)
@@ -98,41 +116,46 @@ vim redis.conf
接下来启动Redis服务器,下面的方式将以默认的配置启动Redis服务。
-```Shell
+```Bash
redis-server
```
如果希望修改Redis的配置(如端口、认证口令、持久化方式等),可以通过下面两种方式。
-方式一:通过参数指定认证口令和AOF持久化方式。
+**方式一**:通过参数指定认证口令和AOF持久化方式。
-```Shell
+```Bash
redis-server --requirepass yourpass --appendonly yes
```
-方式二:通过指定的配置文件来修改Redis的配置。
+**方式二**:通过指定的配置文件来修改Redis的配置。
-```Shell
-redis-server /root/redis-5.0.4/redis.conf
+```Bash
+redis-server /root/redis-5.0.10/redis.conf
```
下面我们使用第一种方式来启动Redis并将其置于后台运行,将Redis产生的输出重定向到名为redis.log的文件中。
-```Shell
+```Bash
redis-server --requirepass yourpass > redis.log &
```
-可以通过ps或者netstat来检查Redis服务器是否启动成功。
+可以通过`ps`或者`netstat`来检查Redis服务器是否启动成功。
-```Shell
+```Bash
ps -ef | grep redis-server
netstat -nap | grep redis-server
```
-接下来,我们尝试用Redis客户端去连接服务器。
+接下来,我们尝试用Redis命令行工具`redis-cli`去连接服务器,该工具默认连接本机的`6379`端口,如果需要指定Redis服务器和端口,可以使用`-h`和`-p`参数分别进行指定。
-```Shell
+```Bash
redis-cli
+```
+
+进入命令行工具后,就可以通过Redis的命令来操作Redis服务器,如下所示。
+
+```Bash
127.0.0.1:6379> auth yourpass
OK
127.0.0.1:6379> ping
@@ -144,9 +167,9 @@ Redis有着非常丰富的数据类型,也有很多的命令来操作这些数
![](./res/redis-data-types.png)
-> **说明**:上面的插图来自付磊和张益军先生编著的《Redis开发与运维》一书。
+> **说明**:上面的插图来自付磊和张益军编著的《Redis开发与运维》一书。
-```Shell
+```Bash
127.0.0.1:6379> set username admin
OK
127.0.0.1:6379> get username
@@ -251,9 +274,14 @@ OK
2) "xuezq"
3) "zhoujl"
4) "chenyx"
-127.0.0.1:6379> geoadd pois 116.39738549206541 39.90862689286386 tiananmen 116.27172936413572 39.99
-135172904494 yiheyuan 117.27766503308104 40.65332064313784 gubeishuizhen
-(integer) 3
+127.0.0.1:6379> zrevrank topsinger zhoujl
+(integer) 2
+127.0.0.1:6379> geoadd pois 116.39738549206541 39.90862689286386 tiananmen
+(integer) 1
+127.0.0.1:6379> geoadd pois 116.27172936413572 39.99135172904494 yiheyuan
+(integer) 1
+127.0.0.1:6379> geoadd pois 117.27766503308104 40.65332064313784 gubeishuizhen
+(integer) 1
127.0.0.1:6379> geodist pois tiananmen gubeishuizhen km
"111.5333"
127.0.0.1:6379> geodist pois tiananmen yiheyuan km
@@ -265,28 +293,31 @@ OK
#### 在Python程序中使用Redis
-可以使用pip安装redis模块。redis模块的核心是名为Redis的类,该类的对象代表一个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执行的结果。上面我们在Redis客户端中使用的命令基本上就是Redis对象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。
+可以使用pip安装名为`redis`的三方库,该三方库的核心是一个名为`Redis`的类,`Redis`对象代表一个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执行的结果。上面我们在Redis客户端中使用的命令基本上就是`Redis`对象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。
-```Shell
+```Bash
pip3 install redis
-python3
```
-```Python
+进入Python交互式环境,使用`redis`三方库来操作Redis。
+
+```Bash
>>> import redis
->>> client = redis.Redis(host='1.2.3.4', port=6379, password='yourpass')
+>>>
+>>> client = redis.Redis(host='127.0.0.1', port=6379, password='yourpass')
+>>>
>>> client.set('username', 'admin')
True
->>> client.hset('student', 'name', 'hao')
+>>> client.hset('student', 'name', 'luohao')
1
->>> client.hset('student', 'age', 38)
+>>> client.hset('student', 'age', 40)
1
>>> client.keys('*')
[b'username', b'student']
>>> client.get('username')
b'admin'
>>> client.hgetall('student')
-{b'name': b'hao', b'age': b'38'}
+{b'name': b'luohao', b'age': b'40'}
```
### MongoDB概述
@@ -299,53 +330,60 @@ MongoDB将数据存储为一个文档,一个文档由一系列的“键值对
目前,MongoDB已经提供了对Windows、macOS、Linux、Solaris等多个平台的支持,而且也提供了多种开发语言的驱动程序,Python当然是其中之一。
-#### MongoDB的安装和配置
+#### MongoDB的安装和启动
-可以从MongoDB的[官方下载链接](https://www.mongodb.com/download-center#community)下载MongoDB,官方为Windows系统提供了一个Installer程序,而Linux和MacOS则提供了压缩文件。下面简单说一下Linux系统如何安装和配置MongoDB。
+可以从MongoDB的[官方下载链接](https://www.mongodb.com/try/download/community)下载MongoDB,官方提供了Windows、macOS和多种Linux版本的安装包。下面以CentOS为例,简单说一下如何安装和启动MongoDB。
-```Shell
-wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.5.tgz
-gunzip mongodb-linux-x86_64-amazon-3.6.5.tgz
-mkdir mongodb-3.6.5
-tar -xvf mongodb-linux-x86_64-amazon-3.6.5.tar --strip-components 1 -C mongodb-3.6.5/
-export PATH=$PATH:~/mongodb-3.6.5/bin
+下载服务器和命令行的RPM安装包。
+
+```Bash
+wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-server-4.4.2-1.el7.x86_64.rpm
+rpm -ivh mongodb-org-server-4.4.2-1.el7.x86_64.rpm
+wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-shell-4.4.2-1.el7.x86_64.rpm
+rpm -ivh mongodb-org-shell-4.4.2-1.el7.x86_64.rpm
+```
+
+启动MongoDB服务器,需要先创建保存数据的文件夹。
+
+```Bash
mkdir -p /data/db
-mongod --bind_ip 172.18.61.250
-
-2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] MongoDB starting : pid=1163 port=27017 dbpath=/data/db 64-bit host=iZwz97tbgo9lkabnat2lo8Z
-2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] db version v3.6.5
-2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
-2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.0-fips29 Mar 2010
-...
-2018-06-03T18:03:28.945+0800 I NETWORK [initandlisten] waiting for connections on port 27017
```
-> **说明**:上面的操作中,export命令是设置PATH环境变量,这样可以在任意路径下执行mongod来启动MongoDB服务器。MongoDB默认保存数据的路径是/data/db目录,为此要提前创建该目录。此外,在使用mongod启动MongoDB服务器时,--bind_ip参数用来将服务绑定到指定的IP地址,也可以用--port参数来指定端口,默认端口为27017。
+修改MongoDB的配置文件,将其中`bindIp`选项的值修改为本机IP地址而不是默认的`127.0.0.1`,本机IP地址可以通过`ifconfig`命令进行查看。
+
+```Bash
+vim /etc/mongod.conf
+```
+
+使用`systemctl`命令启动服务。
+
+```Bash
+systemctl start mongod
+```
#### MongoDB基本概念
-我们通过与关系型数据库进行对照的方式来说明MongoDB中的一些概念。
+我们通过与关系型数据库的比较来说明MongoDB中的一些概念。
-| SQL | MongoDB | 解释(SQL/MongoDB) |
-| ----------- | ----------- | ---------------------- |
-| database | database | 数据库/数据库 |
-| table | collection | 二维表/集合 |
-| row | document | 记录(行)/文档 |
-| column | field | 字段(列)/域 |
-| index | index | 索引/索引 |
-| table joins | --- | 表连接/嵌套文档 |
-| primary key | primary key | 主键/主键(`_id`字段) |
+| SQL | MongoDB |
+| --------------------- | ------------------ |
+| database | database |
+| table(表) | collection(集合) |
+| row(行) | document(文档) |
+| column(列) | field(字段) |
+| index | index |
+| table joins(表连接) | (嵌套文档) |
+| primary key | primary key |
#### 通过Shell操作MongoDB
-启动服务器后可以使用交互式环境跟服务器通信,如下所示。
+0. 启动命令行工具,进入交互式环境。
-```shell
-mongo --host 172.18.61.250
+ ```Bash
+ mongo
+ ```
-MongoDB shell version v3.6.5
-connecting to: mongodb://172.18.61.250:27017/
-```
+ > **说明**:
1. 查看、创建和删除数据库。
@@ -361,7 +399,6 @@ connecting to: mongodb://172.18.61.250:27017/
> // 删除当前数据库
> db.dropDatabase()
{ "ok" : 1 }
- >
```
2. 创建、删除和查看集合。
@@ -383,16 +420,15 @@ connecting to: mongodb://172.18.61.250:27017/
> // 删除colleges集合
> db.colleges.drop()
true
- >
```
- > 说明:在MongoDB中插入文档时如果集合不存在会自动创建集合,所以也可以按照下面的方式通过创建文档来创建集合。
+ > **说明**:在MongoDB中插入文档时如果集合不存在会自动创建集合,所以也可以按照下面的方式通过插入文档来创建集合。
3. 文档的CRUD操作。
```JavaScript
> // 向students集合插入文档
- > db.students.insert({stuid: 1001, name: '骆昊', age: 38})
+ > db.students.insert({stuid: 1001, name: '骆昊', age: 40})
WriteResult({ "nInserted" : 1 })
> // 向students集合插入文档
> db.students.save({stuid: 1002, name: '王大锤', tel: '13012345678', gender: '男'})
@@ -482,22 +518,23 @@ connecting to: mongodb://172.18.61.250:27017/
"numIndexesAfter" : 2,
"ok" : 1
}
- >
```
使用MongoDB可以非常方便的配置数据复制,通过冗余数据来实现数据的高可用以及灾难恢复,也可以通过数据分片来应对数据量迅速增长的需求。关于MongoDB更多的操作可以查阅[官方文档](https://mongodb-documentation.readthedocs.io/en/latest/) ,同时推荐大家阅读Kristina Chodorow写的[《MongoDB权威指南》](http://www.ituring.com.cn/book/1172)。
#### 在Python程序中操作MongoDB
-可以通过pip安装pymongo来实现对MongoDB的操作。
+可以通过pip安装`pymongo`来实现对MongoDB的操作。
```Shell
-pip3 install pymongo
-python3
+pip install pymongo
```
+进入Python交互式环境,就可以执行以下的操作。
+
```Python
>>> from pymongo import MongoClient
+>>>
>>> client = MongoClient('mongodb://127.0.0.1:27017')
>>> db = client.school
>>> for student in db.students.find():
@@ -520,8 +557,9 @@ python3
{'n': 3, 'ok': 1.0}
>>> db.students.find().count()
0
->>> coll = db.students
>>> from pymongo import ASCENDING
+>>>
+>>> coll = db.students
>>> coll.create_index([('name', ASCENDING)], unique=True)
'name_1'
>>> coll.insert_one({'stuid': int(1001), 'name': '骆昊', 'gender': True})
@@ -539,7 +577,6 @@ python3
学号: 1003
姓名: 白元芳
性别: 男
->>>
```
-关于PyMongo更多的知识可以通过它的[官方文档](https://api.mongodb.com/python/current/tutorial.html)进行了解,也可以使用[MongoEngine]()这样的库来简化Python程序对MongoDB的操作,除此之外,还有以异步I/O方式访问MongoDB的三方库[motor]()都是不错的选择。
\ No newline at end of file
+关于[`pymongo`](https://api.mongodb.com/python/current/tutorial.html)更多的知识可以通过它的官方文档进行了解,也可以使用[`MongoEngine`]()这样的库来简化Python程序对MongoDB的操作,除此之外,还有以异步I/O方式访问MongoDB的三方库[`motor`]()都是不错的选择。
\ No newline at end of file
diff --git a/Day36-40/code/SRS_create_and_init.sql b/Day36-40/code/SRS_create_and_init.sql
index 637e514903473aaea8da3325c27378626a4242e8..361d017634b8a2f296f35fc2460d140f526007ae 100644
--- a/Day36-40/code/SRS_create_and_init.sql
+++ b/Day36-40/code/SRS_create_and_init.sql
@@ -2,7 +2,7 @@
drop database if exists school;
-- 创建名为school的数据库并设置默认的字符集和排序方式
-create database school default charset utf8;
+create database school default charset utf8mb4;
-- 切换到school数据库上下文环境
use school;
@@ -34,7 +34,7 @@ create table tb_teacher
(
teaid int not null comment '工号',
teaname varchar(20) not null comment '姓名',
-teatitle varchar(10) default '助教' comment '职称',
+teatitle varchar(10) default '讲师' comment '职称',
collid int not null comment '所属学院',
primary key (teaid),
foreign key (collid) references tb_college (collid)
@@ -68,8 +68,8 @@ unique (sid, cid)
-- 插入学院数据
insert into tb_college (collname, collintro) values
('计算机学院', '计算机学院1958年设立计算机专业,1981年建立计算机科学系,1998年设立计算机学院,2005年5月,为了进一步整合教学和科研资源,学校决定,计算机学院和软件学院行政班子合并统一运作、实行教学和学生管理独立运行的模式。 学院下设三个系:计算机科学与技术系、物联网工程系、计算金融系;两个研究所:图象图形研究所、网络空间安全研究院(2015年成立);三个教学实验中心:计算机基础教学实验中心、IBM技术中心和计算机专业实验中心。'),
-('外国语学院', '四川大学外国语学院设有7个教学单位,6个文理兼收的本科专业;拥有1个一级学科博士授予点,3个二级学科博士授予点,5个一级学科硕士学位授权点,5个二级学科硕士学位授权点,5个硕士专业授权领域,同时还有2个硕士专业学位(MTI)专业;有教职员工210余人,其中教授、副教授80余人,教师中获得中国国内外名校博士学位和正在职攻读博士学位的教师比例占专任教师的60%以上。'),
-('经济管理学院', '四川大学经济学院前身是创办于1905年的四川大学经济科;已故经济学家彭迪先、张与九、蒋学模、胡寄窗、陶大镛、胡代光,以及当代学者刘诗白等曾先后在此任教或学习;1905年,四川大学设经济科;1924年,四川大学经济系成立;1998年,四川大学经济管理学院变更为四川大学经济学院。');
+('外国语学院', '外国语学院设有7个教学单位,6个文理兼收的本科专业;拥有1个一级学科博士授予点,3个二级学科博士授予点,5个一级学科硕士学位授权点,5个二级学科硕士学位授权点,5个硕士专业授权领域,同时还有2个硕士专业学位(MTI)专业;有教职员工210余人,其中教授、副教授80余人,教师中获得中国国内外名校博士学位和正在职攻读博士学位的教师比例占专任教师的60%以上。'),
+('经济管理学院', '经济学院前身是创办于1905年的经济科;已故经济学家彭迪先、张与九、蒋学模、胡寄窗、陶大镛、胡代光,以及当代学者刘诗白等曾先后在此任教或学习。');
-- 插入学生数据
insert into tb_student (stuid, stuname, stusex, stubirth, stuaddr, collid)
@@ -98,7 +98,7 @@ insert into tb_teacher (teaid, teaname, teatitle, collid) values
(1133, '宋远桥', '副教授', 1),
(1144, '杨逍', '副教授', 1),
(2255, '范遥', '副教授', 2),
-(3366, '韦一笑', '讲师', 3);
+(3366, '韦一笑', default, 3);
-- 插入课程数据
insert into tb_course (couid, couname, coucredit, teaid) values
diff --git "a/Day56-60/56-60.\347\224\250FastAPI\345\274\200\345\217\221\346\225\260\346\215\256\346\216\245\345\217\243.md" "b/Day56-60/56-60.\347\224\250FastAPI\345\274\200\345\217\221\346\225\260\346\215\256\346\216\245\345\217\243.md"
index bca96528c971d9b4485616e8c47ce19fd6b7aee7..16eb876e9b38bc8bdb86f9f8b997920088f32562 100644
--- "a/Day56-60/56-60.\347\224\250FastAPI\345\274\200\345\217\221\346\225\260\346\215\256\346\216\245\345\217\243.md"
+++ "b/Day56-60/56-60.\347\224\250FastAPI\345\274\200\345\217\221\346\225\260\346\215\256\346\216\245\345\217\243.md"
@@ -1,2 +1,70 @@
-## 用FastAPI开发数据接口
+## 用FastAPI开发网络数据接口
+
+FastAPI 是一个用于构建API(网络数据接口)的现代、高性能的Web框架,基于Python 3.6+,使用了Python中的类型提示进行类型检查,非常符合工程化开发的需求,在业界有非常好的口碑。下面,我们先用代码告诉大家FastAPI到底能做什么,然后再来讲解它的方方面面。
+
+### FastAPI五分钟上手
+
+1. 安装依赖库和ASGI服务器(支持异步I/O的Python服务器)。
+
+ ```Bash
+ pip install fastapi
+ pip install uvicorn
+ ```
+
+2. 编写代码`main.py`。
+
+ ```Python
+ from fastapi import FastAPI
+
+ app = FastAPI()
+
+
+ @app.get('/')
+ def say_hello():
+ return {'code': 200, 'message': 'hello, world!'}
+ ```
+
+3. 运行服务。
+
+ ```Bash
+ uvicorn main:app --reload
+ ```
+
+ > **说明**:上面运行uvicorn时使用的`--reload`参数会在代码发生变更时自动重新加载新的内容,这个参数在开发阶段非常的有用。
+
+4. 访问服务。
+
+ ![](res/run-first-demo.png)
+
+5. 查看文档。
+
+ ![](res/first-demo-docs.png)
+
+ > **注意**:FastAPI会基于[Swagger UI](https://swagger.io/tools/swagger-ui/)自动为数据接口生成对应的文档。
+
+### 请求和响应
+
+
+
+### 接入关系型数据库
+
+我们可以使用SQLAlchemy三方库来实现对关系型数据库的接入。SQLAlchemy是一个ORM(对象关系映射)框架,ORM框架可以解决Python程序的面向对象模型和关系型数据库的关系模型并不匹配的问题,使得我们可以用面向对象的方式实现数据的CRUD操作。
+
+### 依赖注入
+
+
+
+### 中间件
+
+
+
+### 异步化
+
+
+
+### 虚拟化部署(Docker)
+
+
+
+### 项目实战:车辆违章查询
diff --git a/Day56-60/res/QQ20201127-180608@2x.png b/Day56-60/res/QQ20201127-180608@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..59916ebfbbb64cbe6e775aa257703af34067ad75
Binary files /dev/null and b/Day56-60/res/QQ20201127-180608@2x.png differ
diff --git a/Day56-60/res/QQ20201127-180630@2x.png b/Day56-60/res/QQ20201127-180630@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7ac33e3754536c25704a8d8e64e6af72bfadbcb
Binary files /dev/null and b/Day56-60/res/QQ20201127-180630@2x.png differ
diff --git a/Day56-60/res/QQ20201127-180711@2x.png b/Day56-60/res/QQ20201127-180711@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc8bdf78d007c25dbd801db8e3d267dfaff95565
Binary files /dev/null and b/Day56-60/res/QQ20201127-180711@2x.png differ
diff --git a/Day56-60/res/QQ20201127-180820@2x.png b/Day56-60/res/QQ20201127-180820@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd8a18e8e17b9d71155228ab25651a3e55ecafbe
Binary files /dev/null and b/Day56-60/res/QQ20201127-180820@2x.png differ
diff --git a/Day56-60/res/QQ20201127-180844@2x.png b/Day56-60/res/QQ20201127-180844@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..72577fb620de9b60a7dc950552a2c7879b9f660e
Binary files /dev/null and b/Day56-60/res/QQ20201127-180844@2x.png differ
diff --git a/Day56-60/res/first-demo-docs.png b/Day56-60/res/first-demo-docs.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4688f0db4af024f13174dbf653461840a748495
Binary files /dev/null and b/Day56-60/res/first-demo-docs.png differ
diff --git a/Day56-60/res/run-first-demo.png b/Day56-60/res/run-first-demo.png
new file mode 100644
index 0000000000000000000000000000000000000000..a07b98589e29c6591d0a6ab20ca71b3c96d4cf6c
Binary files /dev/null and b/Day56-60/res/run-first-demo.png differ
diff --git a/Day61-65/res/douban-xpath.png b/Day61-65/res/douban-xpath.png
index 39e49d70eee541ce68381cb93b9aadd07b2553ab..29d8967f5626040ddb428aa8064ece1378a03f02 100644
Binary files a/Day61-65/res/douban-xpath.png and b/Day61-65/res/douban-xpath.png differ
diff --git "a/Day66-70/66.\346\225\260\346\215\256\345\210\206\346\236\220\346\246\202\350\277\260.md" "b/Day66-70/66.\346\225\260\346\215\256\345\210\206\346\236\220\346\246\202\350\277\260.md"
index a051cce12a404c1d029e52ffc46befd54ee844f2..5924d757d1ec70d30ce820e547f1c5280a20fb9d 100644
--- "a/Day66-70/66.\346\225\260\346\215\256\345\210\206\346\236\220\346\246\202\350\277\260.md"
+++ "b/Day66-70/66.\346\225\260\346\215\256\345\210\206\346\236\220\346\246\202\350\277\260.md"
@@ -1,2 +1,2 @@
-## NumPy的应用
+## 数据分析概述
diff --git "a/Day66-70/68.Pandas\347\232\204\345\272\224\347\224\250.md" "b/Day66-70/68.Pandas\347\232\204\345\272\224\347\224\250.md"
index c7139decfcf9b0e308c8883cf00768980c05728f..9a101cfe0535d2173c8fc0b0e32ebb867de71c17 100644
--- "a/Day66-70/68.Pandas\347\232\204\345\272\224\347\224\250.md"
+++ "b/Day66-70/68.Pandas\347\232\204\345\272\224\347\224\250.md"
@@ -1,25 +1,2 @@
## Pandas的应用
-### 1、Pandas入门
-
-### 2、Pandas索引
-
-### 3、Pandas数据清洗之空数据
-
-[数据挖掘之空数据处理(有史以来最全面)]: https://blog.csdn.net/Soft_Po/article/details/89302887
-
-### 4、Pandas多层索引
-
-### 5、Pandas多层索引计算
-
-### 6、Pandas数据集成concat
-
-### 7、Pandas数据集成merge
-
-### 8、Pandas分组聚合操作
-
-### 9、Pandas数据集成实战
-
-### 10、美国大选项目
-
-[2012美国大选政治献金项目数据分析(有史以来最全面)]: https://blog.csdn.net/Soft_Po/article/details/89283382
\ No newline at end of file
diff --git "a/Day66-70/69.\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226.md" "b/Day66-70/69.\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226.md"
index 9f0cbf43baeb9115939e9560438132167395fc02..0c524b4c82a8b9502302b11bd95f75ff04598baf 100644
--- "a/Day66-70/69.\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226.md"
+++ "b/Day66-70/69.\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226.md"
@@ -180,55 +180,3 @@ if __name__ == '__main__':
运行效果如下图所示。
![](./res/result8.png)
-
-### 使用Pygal绘制矢量图
-
-矢量图(SVG)是[计算机图形学](https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6)中用点、直线或者多边形等基于数学方程的几何图元表示的图像,也是目前应用得非常多的一种图像文件格式,全称是“Scalable Vector Graphics”。和使用像素表示图像的位图不同,SVG基于XML存储图像数据,它是W3C定义的一种开放标准的矢量图形语言,可以用来设计更为清晰的Web图像,因为SVG与分辨率无关,在任意放大时不会丢失细节或影响清晰度。SVG可以直接用代码来描绘图像,也可以用任何文字处理工具来打开它,通过改变SVG的代码我们可以让图像具备交互功能。
-
-Python中可以使用Pygal来生成SVG,可以通过pip来安装它。
-
-```Python
-from random import randint
-import pygal
-
-
-def roll_dice(n=1):
- total = 0
- for _ in range(n):
- total += randint(1, 6)
- return total
-
-
-def main():
- results = []
- # 将两颗色子摇10000次记录点数
- for _ in range(10000):
- face = roll_dice(2)
- results.append(face)
- freqs = []
- # 统计2~12点各出现了多少次
- for value in range(2, 13):
- freq = results.count(value)
- freqs.append(freq)
- # 绘制柱状图
- hist = pygal.Bar()
- hist.title = 'Result of rolling two dice'
- hist.x_labels = [x for x in range(2, 13)]
- hist.add('Frequency', freqs)
- # 保存矢量图
- hist.render_to_file('result.svg')
-
-
-if __name__ == '__main__':
- main()
-
-
-```
-
-运行上面的程序,效果如下图所示。
-
-![](./res/result9.png)
-
-### 后记
-
-Matplotlib和NumPy的强大我们在这里也只是窥视了其冰山一角,我们在后续的内容里面还会使用到这两个第三方库,到时候我们再续点为大家介绍其他的功能。
\ No newline at end of file
diff --git "a/Day86-90/86.\345\244\247\346\225\260\346\215\256\346\246\202\350\277\260.md" "b/Day86-90/86.\345\244\247\346\225\260\346\215\256\346\246\202\350\277\260.md"
new file mode 100644
index 0000000000000000000000000000000000000000..9adeac94d6ab238c7df110a9583d293bf696e5e2
--- /dev/null
+++ "b/Day86-90/86.\345\244\247\346\225\260\346\215\256\346\246\202\350\277\260.md"
@@ -0,0 +1,2 @@
+## 大数据概述
+
diff --git "a/Day86-90/87.Hive\346\237\245\350\257\242.md" "b/Day86-90/87.Hive\346\237\245\350\257\242.md"
new file mode 100644
index 0000000000000000000000000000000000000000..9adeac94d6ab238c7df110a9583d293bf696e5e2
--- /dev/null
+++ "b/Day86-90/87.Hive\346\237\245\350\257\242.md"
@@ -0,0 +1,2 @@
+## 大数据概述
+
diff --git "a/Day86-90/88.PySpark\345\222\214\347\246\273\347\272\277\346\225\260\346\215\256\345\244\204\347\220\206.md" "b/Day86-90/88.PySpark\345\222\214\347\246\273\347\272\277\346\225\260\346\215\256\345\244\204\347\220\206.md"
new file mode 100644
index 0000000000000000000000000000000000000000..9adeac94d6ab238c7df110a9583d293bf696e5e2
--- /dev/null
+++ "b/Day86-90/88.PySpark\345\222\214\347\246\273\347\272\277\346\225\260\346\215\256\345\244\204\347\220\206.md"
@@ -0,0 +1,2 @@
+## 大数据概述
+
diff --git "a/Day86-90/89.Flink\345\222\214\346\265\201\345\274\217\346\225\260\346\215\256\345\244\204\347\220\206.md" "b/Day86-90/89.Flink\345\222\214\346\265\201\345\274\217\346\225\260\346\215\256\345\244\204\347\220\206.md"
new file mode 100644
index 0000000000000000000000000000000000000000..9adeac94d6ab238c7df110a9583d293bf696e5e2
--- /dev/null
+++ "b/Day86-90/89.Flink\345\222\214\346\265\201\345\274\217\346\225\260\346\215\256\345\244\204\347\220\206.md"
@@ -0,0 +1,2 @@
+## 大数据概述
+
diff --git "a/Day86-90/90.\345\244\247\346\225\260\346\215\256\345\210\206\346\236\220\351\241\271\347\233\256\345\256\236\346\210\230.md" "b/Day86-90/90.\345\244\247\346\225\260\346\215\256\345\210\206\346\236\220\351\241\271\347\233\256\345\256\236\346\210\230.md"
new file mode 100644
index 0000000000000000000000000000000000000000..9adeac94d6ab238c7df110a9583d293bf696e5e2
--- /dev/null
+++ "b/Day86-90/90.\345\244\247\346\225\260\346\215\256\345\210\206\346\236\220\351\241\271\347\233\256\345\256\236\346\210\230.md"
@@ -0,0 +1,2 @@
+## 大数据概述
+
diff --git "a/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" "b/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md"
index 80caeca3c4be6475aae5d0678fe6d0199507f133..815f2a2c2533d890d8a585dac608020db7e44643 100644
--- "a/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md"
+++ "b/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md"
@@ -92,10 +92,10 @@ MySQL支持做数据分区,通过分区可以存储更多的数据、优化查
mysql> set global slow_query_log_file='/var/log/mysqld-slow.log'
mysql> set global slow_query_log='ON';
mysql> set global long_query_time=1;
- ```
-
- 或者直接修改MySQL配置文件启用慢查询日志。
+ ```
+ - 或者直接修改MySQL配置文件启用慢查询日志。
+
```INI
[mysqld]
slow_query_log=ON
@@ -217,8 +217,8 @@ MySQL支持做数据分区,通过分区可以存储更多的数据、优化查
- 分页查询时,一个比较头疼的事情是如同`limit 1000, 20`,此时MySQL已经排序出前1020条记录但是仅仅返回第1001到1020条记录,前1000条实际都用不上,查询和排序的代价非常高。一种常见的优化思路是在索引上完成排序和分页的操作,然后根据返回的结果做表连接操作来得到最终的结果,这样可以避免出现全表查询,也避免了外部排序。
```SQL
- select * from tb_emp order by ename limit 1000, 20;
- select * from tb_emp t1 inner join (select eno from tb_emp order by ename limit 1000, 20) t2 on t1.eno=t2.eno;
+ select * from tb_emp order by ename limit 10000, 20;
+ select * from tb_emp t1 inner join (select eno from tb_emp order by ename limit 10000, 20) t2 on t1.eno=t2.eno;
```
上面的代码中,第2行SQL是优于第1行SQL的,当然我们的前提是已经在`ename`字段上创建了索引。
@@ -275,7 +275,5 @@ show status like 'slow_queries';
5. 配置MySQL集群。
-
-
> **说明**:本章内容参考了网易出品的《深入浅出MySQL》一书,该书和《高性能MySQL》一样,都对MySQL进行了深入细致的讲解,虽然总体感觉后者更加高屋建瓴,但是前者也算得上是提升MySQL技能的佳作(作者的文字功底稍显粗糙,深度也不及后者),建议有兴趣的读者可以阅读这两本书。
diff --git a/README.md b/README.md
index 7dd69c5103ecca91d23f1547f7c62752520da8a9..f725ad80b402acbe539b87d840fd4c4487af9999 100644
--- a/README.md
+++ b/README.md
@@ -209,7 +209,7 @@ Python在以下领域都有用武之地。
- 数据完整性
- 数据一致性
- 在Python中操作MySQL
-- [NoSQL入门](./Day36-40/39-40.NoSQL入门.md)
+- [NoSQL数据库入门](./Day36-40/39-40.NoSQL数据库入门.md)
- NoSQL概述
- Redis概述
- Mongo概述
@@ -394,15 +394,15 @@ Python在以下领域都有用武之地。
### Day86~90 - [大数据分析概述](./Day86-90)
-####Day86 - [大数据概述]()
+####Day86 - [大数据概述](./Day86-90/86.大数据概述.md)
-#### Day87 - [Hive查询]()
+#### Day87 - [Hive查询](./Day86-90/87.Hive查询.md)
-#### Day88 - [PySpark和离线数据处理]()
+#### Day88 - [PySpark和离线数据处理](./Day86-90/87.PySpark和离线数据处理.md)
-#### Day89 - [Flink和流式数据处理]()
+#### Day89 - [Flink和流式数据处理](./Day86-90/89.Flink和流式数据处理.md)
-#### Day90 - [大数据分析项目实战]()
+#### Day90 - [大数据分析项目实战](./Day86-90/90.大数据分析项目实战.md)
### Day91~100 - [团队项目开发](./Day91-100)