数据形态
下面给你一个高价值可长期复用的总结:
常用的数据查询场景 -> SQL 查询形态 -> 查询结果的数据结构 -> Python 中的对应数据格式。
这是一个完全贴近你在 FastAPI + SQLAlchemy + PostgreSQL 项目中使用的“实战速查表”,可以直接用在你的业务逻辑、ORM 查询、数据转换工具函数中。
- 查询总数
- 查询最大值/最小值/平均值
- 查询某个字段是否存在
- 获取某个 ID 是否存在
SELECT COUNT(*) FROM users;
SELECT MAX(age) FROM users;
SELECT EXISTS(SELECT 1 FROM users WHERE id=1);
| 类型 | 示例 |
|---|---|
| 单个数值(int/bigint/numeric) | 123 |
| 布尔值 | true/false |
| 单个字符串 | ‘hello’ |
| Python 类型 | 示例 |
|---|---|
| int | 123 |
| float | 12.34 |
| str | “hello” |
| bool | True/False |
count = session.execute(stmt).scalar_one()
- 查询单个用户
- 查询详情页数据
- 查询最新一条记录
SELECT id, name, age FROM users WHERE id = 1;
类似:
(1, 'Alice', 20)
| Python 类型 | 示例 |
|---|---|
| tuple | (1, “Alice”, 20) |
| ORM 对象 | User(id=1, name=“Alice”) |
| dict(转换后) | {‘id’:1, ’name’:‘Alice’, ‘age’:20} |
obj = session.execute(stmt).scalar_one()
- 查询所有 code
- 查询股票名称列表
- 查询某表所有主键
- 查询一组数值用于 IN 查询
SELECT code FROM ashare;
['000001', '000002', '000003']
| Python 类型 | 示例 |
|---|---|
list[str] |
["000001", "000002"] |
list[int] |
[1, 2, 3] |
codes = session.execute(stmt).scalars().all()
- 列表页
- 分页数据
- 任意 JOIN
- 报表数据
- 用户列表、股票列表等
SELECT code, name, price FROM ashare ORDER BY code LIMIT 10;
[('000001', '平安银行', 10.5),
('000002', '万科A', 13.2)]
| Python 格式 | 示例 |
|---|---|
list[tuple] |
[("000001","平安银行",10.5)] |
list[ORM 对象] |
[Ashare(...), Ashare(...)] |
list[dict](你项目常用) |
[{"code":"000001", "name":"平安银行"}] |
rows = session.execute(
select(Ashare.code, Ashare.name, Ashare.price)
).all() # list of tuples
若使用 ORM 模式:
objs = session.execute(select(Ashare)).scalars().all()
- 聚合统计
- 分组统计(group by)
- 业务报表
- 柱状图、折线图数据源
SELECT plate, COUNT(*)
FROM ashare
GROUP BY plate;
[('银行', 32), ('科技', 20)]
list[tuple]
转 dict:
{"银行": 32, "科技": 20}
- jsonb 字段存储
- 动态属性
- 聚合生成 JSON 对象
SELECT json_build_object('code', code, 'name', name)
FROM ashare LIMIT 1;
{"code":"000001","name":"平安银行"}
| Python 类型 | 示例 |
|---|---|
dict |
{"code": "000001", "name": "平安银行"} |
list[dict] |
[{}, {}] |
- 股票标签
- 用户角色列表
- 文章标签
- ANY/ALL 查询
SELECT tags FROM articles;
{"科技","AI","大模型"}
["科技", "AI", "大模型"]
- 复杂筛选
- Top1 子查询
- 分组后取最新记录
SELECT *
FROM stock s
WHERE s.id = (
SELECT id FROM stock ORDER BY date DESC LIMIT 1
);
ORM 对象或 tuple。
- 用户与角色
- 股票与概念板块
- 数据关联查询
- 多表报表
SELECT u.id, u.name, r.role
FROM users u
JOIN roles r ON u.role_id = r.id;
| 格式 | 示例 |
|---|---|
| tuple | (1, "张三", "admin") |
| dict(转换后) | {"id":1,"name":"张三","role":"admin"} |
SELECT id, name FROM users ORDER BY id LIMIT 10 OFFSET 20;
list[dict] | list[tuple] | list[ORM]
| 场景 | SQL 结果 | Python 形式 |
|---|---|---|
| 单值 | 5 |
int/str/float/bool |
| 单行 | (1, "A") |
tuple / dict / ORM |
| 单列 | ['a','b'] |
list[str] |
| 多行多列 | [(...),(...)] |
list[tuple] / list[dict] / ORM |
| 聚合统计 | [(key, val)] |
list[tuple] / dict |
| JSON | {"a":1} |
dict |
| 数组 | {1,2,3} |
list |
| JOIN | [(...)] |
list[tuple] / list[dict] |
| 分页 | [(...)] |
list[...] |