这个非常有挑战的任务在上个世纪 70 年代有了一个相当好的解决方案,那就是 IBM 的计算机科学家 E. F. Codd 设计的 “关系型数据库(relational database)”,他在论文 “A Relational Model of Data for Large Shared Data Banks” 中详细阐述了 “relational” 的含义,这一理论被称为 “关系模型(relational model)”,是关系型数据库设计实现和运用的基础,按照关系模型设计的数据库管理系统就叫做 “关系型数据库管理系统(RDBMS)”。
以 MySQL、PostgreSQL 为代表的开源系统,广泛用于各种规模的互联网应用,因为开源,很多巨型互联网公司会对其进行修改定制以满足自己的需要;注意 MySQL 2008 年被 Sun 收购,2010 年 Sun 又被 Oracle 收购,所以现在 MySQL 实际上是属于 Oracle 的资产,但运作上有一定的独立性;
SELECT
airlines.country,
airlines.name,
routes.source,
routes.dest
FROM
routes
JOIN airports ON routes.source = airports.code
JOIN airlines ON airlines.id = routes.airline_id
WHERE
airports.city = "Shanghai"
AND airports.name = "Pudong"
ORDER BY
airlines.country,
airlines.name
主框架还是 SELECTFROM,FROM 后面是主表 routes,差别在于增加了两个 JOIN...ON 子句,从而把 airports、airlines 与主表关联起来,关联条件写在 ON 后面。
import sqlite3
import pandas as pd
sql = 'SELECT airlines.country,airlines.name,routes.source,routes.dest \
FROM routes JOIN airports ON routes.source=airports.code JOIN airlines ON airlines.id=routes.airline_id \
WHERE airports.city="Shanghai" AND airports.name="Pudong" ORDER BY airlines.country,airlines.name'
conn = sqlite3.connect('assets/flights.db')
df = pd.read_sql_query(sql, conn)
df.head()
MySQL 是目前世界上应用最多的数据库,根据 Datanyze 的统计,MySQL 目前占超过 46% 的市场份额,第二和第三名分别是 PostgreSQL 和 Microsoft SQL Server,份额分别为 10.11% 和 9.28%,可见优势之巨大。
MySQL 从 RDBMS 的角度来说,历史悠久功能强大而完备,远非轻量级的 SQLite 能比,但是基本的使用套路和 SQLite 没有太大的区别,也是 connection 和 cursor 那一套。不过 MySQL 本身比 SQLite 复杂很多,不是一个数据文件加一个库就能搞定,必须安装 MySQL 服务和专属的客户端库才能使用,关于 MySQL 服务环境的准备可以参考这篇指南。
[x] 提醒
如果配置环境不顺利,也不要紧,目前阶段从下面的例子中获得一些感性认识就够了。
[x] 安装最新的 MySQL Connector/Python
在继续之前我们还需要安装最新的 MySQL Connector/Python:pip3 install mysql-connector-python,这是我们在 Python 程序中连接 MySQL 的客户端支持库,提供了连接 MySQL 服务访问数据的能力,相当于我们前面使用的 sqlite3 库。
总之配置 MySQL 连接时,host user passwd database 这四个参数对应 MySQL 服务的地址、用户名、密码和数据库名,根据你的环境设置即可。
import mysql.connector as mysql
import pandas as pd
conn = mysql.connect(
host = 'localhost',
user = 'learn',
passwd = 'demo',
database = 'fifa19'
)
sql = 'SELECT Name, Age, Nationality FROM players WHERE Club LIKE "%Barcelona%";'
我们可以在 mysql 命令行中执行命令 USE demo 然后 DESC users; 来查看建好的表 users 的列定义,mysql 会返回:
mysql> USE demo
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> DESC users;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(255) | YES | | NULL | |
| firstname | varchar(255) | YES | | NULL | |
| lastname | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379>
[x] 2. 用 SET key value 命令插入一些 key-value 数据,用 KEYS * 命令来列出所有 keys,用 GET key 命令来查询对应的 value:
127.0.0.1:6379> SET Bahamas Nassau
OK
127.0.0.1:6379> SET Croatia Zagreb
OK
127.0.0.1:6379> SET China Beijing
OK
127.0.0.1:6379> KEYS *
1) "China"
2) "Croatia"
3) "Bahamas"
127.0.0.1:6379> KEYS C*
1) "China"
2) "Croatia"
127.0.0.1:6379> GET Croatia
"Zagreb"
0. 内容概述 及 学习建议
1. 程序内的数据
1.1 程序内的数据
1.2 数据的表达和处理中的难题 以及 相应的解决方案
2. 关系模型
2.1 表
2.2 行与列
2.3 主键
2.4 外键
3. RDBMS
3.1 数据操作和事务处理
3.2 维护数据一致性
3.3 数据访问优化
3.4 数据库集群
3.5 数据库安全
3.6 主流 RDBMS
4. RDBMS 以外
5. Python 中的实例
5.1 CSV 数据文件
pip3 install pandas
。结果如下:
5.2 JSON 数据
https://www.genshuixue.com/sapi/viewLogic/selectCourse/courses?course=all&size=12&subjectId=0&gradeId=200&categoryId=10
urllib3
是一个 HTTP 客户库(注意这是第三方库,需要先安装pip3 install urllib3
)[x] 如果一开始搞不清楚,我们可以在代码中插入
print()
来查看每一小步输出的是什么,试试看,会对整个过程了解得更加清楚。[x] 接下去我们就可以把
data
作为一个普通的 dict 对象来使用了,里面可能嵌套了好多层的 dict 和 list 对象:5.3 SQLite 数据库
5.3.1 数据连接和游标
5.3.2 SQL 初见
(index=867,airline=3U,airline_id=4608,source=PVG,...)
airlines.id = routes.airline_id
5.3.3 用 pandas 加载数据
DataFrame
对象。5.4 MySQL 数据库
5.4.1 数据连接和访问
5.4.2 数据事务和锁
5.4.3 用事务操作数据
INSERT
这个 SQL 命令(语法并不难懂,很容易理解):这个时候如果我们在 mysql 命令行中输入
SELECT * FROM users;
会发现并没有任何数据行,插入数据的操作未被执行,是的,因为我们需要告诉数据库,“以上操作告一段落,请执行”,否则 RDBMS 会等待我们提交更多请求一起执行,这中间所有请求都会被视为一个完整的事务。要提交执行的命令给数据库,使用数据连接的commit()
方法:AUTO_INCREMENT
的效果UPDATE
:5.5 Redis
5.5.1 使用 Redis 客户端
redis-cli
就会进入到 Redis 的 REPL 提示符:SET key value
命令插入一些 key-value 数据,用KEYS *
命令来列出所有 keys,用GET key
命令来查询对应的value
:MSET
和MGET
来做批量操作,MSET
后面是一串key1 value1 key2 value2 key3 value3...
这样依次排列的key-value
们,而MGET
后面是一串想取得 value 的 keys:EXISTS
命令来判断某个 key 是否存在,存在返回1
,否则返回0
:HSET
和HGET
来读写hash
类型的 value:5.5.2 使用 Python 访问
pip3 install redis
。然后就可以在 Python 代码中使用 Redis 了。r
来做所有的事情了,就和我们在 REPL 中输入命令效果相当。6. 小结
Logging
2020-04-15 11:16:18 initialize