Skip to content

练习 — 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.WithTimeout 5 秒取消
  • 捕获并返回 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

学习导航

上一篇:SQL 基础与表设计 · 对应知识文档 · 下一篇:Repository 与 ORM