M3.2
任务描述
「奈斯!」bLue 说道。
「等等,这样就结束了吗?」你问道。
「嗯…是时候启用数据库了。」bLue 喃喃自语道。
任务要求
你需要实现一个后端程序,和之前一样提供查询选手信息和 rating 记录的 HTTP 服务。但你需要使用真正的关系型数据库进行持久化存储和数据交互。
在这里,请使用轻量的关系型数据库 SQLite。你需要建立一个数据库 cf
(数据库文件名为 cf.db
)并建立两张数据表 user_info
和 user_rating
,其表结构如下所示。
user_info
字段名 | 类型 | 约束 | 说明 |
---|---|---|---|
handle | VARCHAR | 主键,非空 | 选手的 handle |
rating | INT | 选手的当前 rating | |
rank | VARCHAR | 选手的当前 rank | |
updated_at | DATETIME | 非空 | 爬取时间 |
user_rating
字段名 | 类型 | 约束 | 说明 |
---|---|---|---|
user_rating_id | INT | 主键,递增,非空 | 自动递增的 ID |
handle | VARCHAR | 外键 user_info.handle ,非空 | 选手的 handle |
contest_id | INT | 非空 | 比赛 ID |
contest_name | VARCHAR | 非空 | 比赛名称 |
rank | INT | 非空 | 选手在此比赛取得的 rank |
old_rating | INT | 非空 | 选手在此比赛前的 rating |
new_rating | INT | 非空 | 选手在此比赛后的 rating |
rating_updated_at | DATETIME | 非空 | rating 更新时间 |
updated_at | DATETIME | 非空 | 爬取时间 |
TIP
对于 user_rating
表,每一行数据表示一条具体比赛的 rating 记录,因此当你爬取到一位选手的 rating 记录时,可能会插入/更新多条数据。
为测试方便,所有数据的有效期均为 30 秒。当数据过期时,你应当重新爬取并更新数据到对应的数据表。
请求格式和示例
同 M3.1。
建议完成用时
1-2 天。
自学参考资料关键词
- 数据库
- SQLite
总结回顾检查点
- 什么是关系型数据库?
- SQLite 中有哪些数据类型?
- 什么是主键、外键?
- 查询、更新、删除数据的 SQL 语句分别是什么?
进阶思考题
- 试一试:在一条 SQL 中查询指定选手的信息及其所有 rating 记录。