# LearningAnalytics 数据库修复指南

## 问题描述

在提交评分时出现两类错误：

### 错误1: IP 地址类型不匹配
```
psycopg2.errors.DatatypeMismatch: column "ip_address" is of type inet but expression is of type character varying
```
**原因**：`ip_address` 字段类型为 `INET`，但应用传递字符串 `'127.0.0.1'`。

### 错误2: 分数值溢出
```
psycopg2.errors.NumericValueOutOfRange: numeric field overflow
DETAIL: A field with precision 5, scale 4 must round to an absolute value less than 10^1.
```
**原因**：`partial_score` 字段类型为 `NUMERIC(5,4)`，只能存储 -9.9999 到 9.9999，但实际分数可能达到 7-10 分。

## 解决方案

1. 修改 `ip_address` 字段类型为 `VARCHAR(64)`
2. 修改 `partial_score` 字段类型为 `NUMERIC(6,2)`

## 使用方法

### 方法一：使用自动修复脚本（推荐）

```bash
cd /Volumes/T9/code/math/apis/FilamentAdmin/scripts
bash fix_learning_analytics_db.sh
```

脚本会自动：
1. 检测数据库容器
2. 执行 SQL 修复命令
3. 验证修复结果

### 方法二：手动执行 SQL

1. **连接数据库**：
   ```bash
   docker exec -it learning_analytics_postgres psql -U rag_user -d learning_analytics
   ```

2. **执行修复**：
   ```sql
   -- 修改 ip_address 字段类型
   ALTER TABLE student_attempts
   ALTER COLUMN ip_address TYPE VARCHAR(64);

   -- 修改 partial_score 字段类型
   ALTER TABLE student_attempts
   ALTER COLUMN partial_score TYPE NUMERIC(6,2);
   ```

3. **验证**：
   ```sql
   \d student_attempts | grep -E "ip_address|partial_score"
   ```

## 文件说明

- `fix_learning_analytics_db.sh` - 自动修复脚本
- `../database/migrations/2025_12_02_fix_learning_analytics_ip_address_type.sql` - SQL 脚本
- `README_DB_FIX.md` - 本说明文档

## 验证成功

执行成功后，应看到：
```
✓ 修复完成!
  - ip_address: INET → VARCHAR(64)
  - partial_score: NUMERIC(5,4) → NUMERIC(6,2)
```

## 字段类型说明

### ip_address
- **原类型**: `INET` (网络地址类型)
- **新类型**: `VARCHAR(64)` (字符串类型)
- **用途**: 存储客户端 IP 地址
- **优点**: 避免类型转换问题，兼容性更好

### partial_score
- **原类型**: `NUMERIC(5,4)` (1位整数 + 4位小数 = -9.9999 到 9.9999)
- **新类型**: `NUMERIC(6,2)` (4位整数 + 2位小数 = -9999.99 到 9999.99)
- **用途**: 存储题目得分，支持 0-100 分的常规考试分数
- **优点**: 足够的整数位存储满分 100 分，保留 2 位小数

## 注意事项

- 这些修改不影响数据完整性
- 修复后需要重启 LearningAnalytics 服务：`docker-compose restart learning-analytics`
- 确保 FilamentAdmin 和 LearningAnalytics 服务都已重启

## 测试

修复完成后，访问 http://fa.test/admin/upload-exam-paper 测试评分提交功能。应该能够正常为选择题、填空题、解答题评分并提交。
