---
name: db-validation
description: 数据库验证规范。测试 API 接口、验证业务逻辑、调试数据问题时使用。包含 PostgreSQL MCP 工具使用方法和验证示例。
---

# 数据库验证规范

**AI 在测试接口或验证业务逻辑时，必须使用 PostgreSQL MCP 工具直接查询数据库验证数据的正确性。**

## 触发条件

在以下情况下必须遵守本规范：
- 测试 API 接口后验证数据
- 检查数据库表结构
- 验证数据库迁移结果
- 调试业务逻辑
- 验证事务处理
- 检查数据权限过滤

## 何时使用 PostgreSQL MCP

### ✅ 必须使用的场景

- 测试 API 接口后验证数据是否正确写入数据库
- 检查数据库表结构是否符合 Model 定义
- 验证数据库迁移是否成功执行
- 调试业务逻辑时查看实际数据状态
- 验证事务是否正确提交或回滚
- 检查数据权限过滤是否生效

### ❌ 不要

- 仅依赖 API 响应判断数据是否正确（响应可能只是内存中的临时数据）
- 通过日志推测数据库状态
- 假设代码逻辑正确就认为数据正确

## 可用的 PostgreSQL MCP 工具

```
1. PostgresListSchemas - 列出所有数据库模式
2. PostgresListObjects - 列出指定模式下的表/视图/序列
3. PostgresGetObjectDetails - 查看表结构详情（字段、类型、约束、注释）
4. PostgresExecuteSql - 执行只读 SQL 查询（SELECT）
```

## 验证示例

### 场景 1：测试创建用户接口

```
1. 调用 POST /api/v1/accounts 创建用户
   → 响应：{"code":0, "data":{"id":123, "username":"testuser"}}

2. ✅ 使用 PostgreSQL MCP 验证数据库
   PostgresExecuteSql:
   - sql: "SELECT id, username, user_type, status, created_at FROM tb_account WHERE id = 123"
   
3. 检查查询结果：
   ✅ 用户确实已创建
   ✅ 字段值与请求参数一致
   ✅ status = 1（启用）
   ✅ created_at 有值
```

### 场景 2：测试数据权限过滤

```
1. 以代理用户登录，查询店铺列表
   → 响应：返回 5 个店铺

2. ✅ 使用 PostgreSQL MCP 验证过滤逻辑
   PostgresExecuteSql:
   - sql: "SELECT id, shop_name, parent_id FROM tb_shop WHERE deleted_at IS NULL"
   
3. 检查：
   ✅ 数据库实际有 10 个店铺
   ✅ API 只返回了当前用户及下级的 5 个店铺
   ✅ 数据权限过滤生效
```

### 场景 3：验证迁移执行

```
1. 执行迁移：make migrate-up

2. ✅ 验证表结构
   PostgresGetObjectDetails:
   - schema_name: "public"
   - object_name: "tb_account"
   - object_type: "table"
   
3. 检查：
   ✅ 新字段 enterprise_id 已添加
   ✅ 类型为 bigint
   ✅ 允许 NULL
   ✅ 注释为"企业ID"
```

## 工具使用方法

### 查看表结构

```
PostgresGetObjectDetails: 
- schema_name: "public"
- object_name: "tb_permission"
- object_type: "table"
```

### 列出所有表

```
PostgresListObjects:
- schema_name: "public"
- object_type: "table"
```

### 执行查询

```
PostgresExecuteSql:
- sql: "SELECT * FROM tb_permission LIMIT 5"
```

## 注意事项

### ⚠️ 限制

- PostgreSQL MCP 只支持只读查询（SELECT），不能执行 INSERT/UPDATE/DELETE
- 如需插入测试数据，使用 Go 脚本或迁移文件

### ⚠️ 安全

- 避免在查询中暴露敏感数据（如密码哈希）
- 生产环境使用时需谨慎，避免查询大量数据

### ✅ 最佳实践

- 每次 API 测试后都验证数据库状态
- 使用 LIMIT 限制查询结果数量（如 `LIMIT 10`）
- 验证完成后清理测试数据

## AI 助手检查清单

测试接口后必须：

1. ✅ 使用 PostgresExecuteSql 查询相关数据
2. ✅ 验证数据是否正确写入
3. ✅ 验证字段值是否符合预期
4. ✅ 验证关联数据是否正确
5. ✅ 如有数据权限，验证过滤是否生效
