外观
练习 — PostgreSQL 与 database/sql
对应知识点:
PostgreSQL·database/sql·Connection Pool对应文档:docs/phase-04-database/postgresql-database-sql.md代码目录:workspace/phase-04/db-demo/
前置条件:完成 SQL 基础练习,PostgreSQL 可连接。
Level 1 — 基础
练习 1.1 · 连接数据库
在 workspace/phase-04/db-demo/ 创建 Go 项目:
要求:
- 驱动:
github.com/jackc/pgx/v5/stdlib - 从环境变量
DATABASE_URL读取连接串(默认postgres://postgres:secret@localhost:5432/digital_twin?sslmode=disable) sql.Open+db.Ping()验证连接- defer
db.Close()
练习 1.2 · 单行查询
要求:
SELECT id, name, status FROM devices WHERE id = $1- 使用
db.QueryRow+Scan - 不存在时返回
sql.ErrNoRows并处理
练习 1.3 · 多行查询
要求:
- 查询所有
device_type = 'agv'的设备 db.Query+rows.Next+Scan- 正确处理
rows.Err()和rows.Close()
Level 2 — 应用
练习 2.1 · 插入与返回
要求:
INSERT INTO devices (id, name, device_type, status) VALUES ($1,$2,$3,$4)- 使用
Exec并检查RowsAffected - 重复 id 时处理唯一约束错误
练习 2.2 · 事务
要求:
db.BeginTx(ctx, nil)- 事务内:更新 AGV 状态 + 插入告警
- 任一步失败
Rollback,成功Commit - 使用
context.Context传递
练习 2.3 · 连接池配置
要求:
- 设置
SetMaxOpenConns(25)、SetMaxIdleConns(5)、SetConnMaxLifetime(time.Hour) - 注释说明各参数对数字孪生高并发读写的意义
Level 3 — 综合
练习 3.1 · 遥测批量插入
要求:
- 函数
InsertTelemetryBatch(ctx, []Telemetry) error - 使用事务 + prepared statement 或 pgx batch
- 插入 100 条模拟 AGV 轨迹点
练习 3.2 · 最新位置查询
要求:
- SQL:
DISTINCT ON (device_id)或窗口函数取每台设备最新遥测 - Go 函数
GetLatestPositions(ctx) ([]DevicePosition, error) - 返回 deviceId、x、y、battery、recordedAt
练习 3.3 · Context 超时
要求:
- 所有 DB 操作接受
context.Context - 模拟慢查询,用
context.WithTimeout5 秒取消 - 捕获并返回
context.DeadlineExceeded
Level 4 — 项目实践
练习 4.1 · Phase 03 API 接入 PostgreSQL
在 workspace/phase-04/db-demo/ 将 Project 01 设备 API 改为真实 DB:
要求:
- 复用 Phase 04 SQL schema(devices、telemetry)
GET /api/v1/devices从 DB 查询GET /api/v1/devices/:id/telemetry?limit=50返回历史- store 层封装所有 SQL,handler 不直接写查询
- docker-compose 或文档说明 PostgreSQL 启动方式
- seed 脚本插入 5 台 AGV + 遥测数据
学习检查
- [ ]
sql.Open是否会立即连接? - [ ] QueryRow 无结果与 Scan 错误的区别?
- [ ] 为何必须 defer rows.Close()?
- [ ] 连接池 MaxOpenConns 设置过大有何风险?
提交方式
检查答案 — postgresql database sql 练习 X.X