fix_learning_analytics_db.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/bin/bash
  2. # LearningAnalytics 数据库修复脚本
  3. # 修复 student_attempts 表的字段类型错误
  4. # 1. ip_address: INET → VARCHAR(64)
  5. # 2. partial_score: NUMERIC(5,4) → NUMERIC(6,2)
  6. # 用法: bash fix_learning_analytics_db.sh
  7. set -e # 遇到错误立即退出
  8. echo "=========================================="
  9. echo "LearningAnalytics 数据库修复脚本"
  10. echo "=========================================="
  11. echo ""
  12. # 数据库配置
  13. DB_HOST="localhost"
  14. DB_PORT="5433"
  15. DB_NAME="learning_analytics"
  16. DB_USER="rag_user"
  17. DB_PASSWORD="your_password"
  18. # 检查数据库容器是否存在
  19. if docker ps -a | grep -q "learning_analytics_postgres"; then
  20. echo "✓ 检测到数据库容器: learning_analytics_postgres"
  21. DB_HOST="learning_analytics_postgres"
  22. DB_PORT="5432"
  23. else
  24. echo "⚠ 未检测到专用数据库容器,将使用本地 PostgreSQL"
  25. echo " 请确保本地 PostgreSQL 服务正在运行"
  26. fi
  27. echo ""
  28. echo "数据库配置:"
  29. echo " 主机: $DB_HOST"
  30. echo " 端口: $DB_PORT"
  31. echo " 数据库: $DB_NAME"
  32. echo " 用户: $DB_USER"
  33. echo ""
  34. # 执行 SQL 修复脚本
  35. echo "正在执行数据库修复..."
  36. echo " 修复字段:"
  37. echo " 1. ip_address: INET → VARCHAR(64)"
  38. echo " 2. partial_score: NUMERIC(5,4) → NUMERIC(6,2)"
  39. echo ""
  40. # 方法1: 使用 docker exec (推荐)
  41. if docker ps | grep -q "learning_analytics_postgres"; then
  42. docker exec learning_analytics_postgres psql -U rag_user -d learning_analytics <<'EOF'
  43. -- 1. 修改 ip_address 字段类型
  44. ALTER TABLE student_attempts
  45. ALTER COLUMN ip_address TYPE VARCHAR(64);
  46. -- 2. 修改 partial_score 字段类型
  47. ALTER TABLE student_attempts
  48. ALTER COLUMN partial_score TYPE NUMERIC(6,2) USING partial_score::NUMERIC(6,2);
  49. -- 3. 添加注释
  50. COMMENT ON COLUMN student_attempts.ip_address IS '客户端IP地址,字符串格式';
  51. COMMENT ON COLUMN student_attempts.partial_score IS '题目得分,保留2位小数,支持0-9999.99分';
  52. -- 4. 输出成功消息
  53. \echo ''
  54. \echo '✓ 修复完成!'
  55. \echo ' - ip_address: INET → VARCHAR(64)'
  56. \echo ' - partial_score: NUMERIC(5,4) → NUMERIC(6,2)'
  57. \echo ''
  58. EOF
  59. echo "✓ 数据库修复完成!"
  60. else
  61. echo "⚠ 未找到 learning_analytics_postgres 容器"
  62. echo " 请手动运行以下 SQL 命令:"
  63. echo ""
  64. echo " psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c \""
  65. echo " ALTER TABLE student_attempts"
  66. echo " ALTER COLUMN ip_address TYPE VARCHAR(64);"
  67. echo " ALTER TABLE student_attempts"
  68. echo " ALTER COLUMN partial_score TYPE NUMERIC(6,2);"
  69. echo " \""
  70. echo ""
  71. fi
  72. echo ""
  73. echo "验证修复结果..."
  74. echo ""
  75. # 验证字段类型
  76. if docker ps | grep -q "learning_analytics_postgres"; then
  77. echo "检查 ip_address 字段:"
  78. docker exec learning_analytics_postgres psql -U rag_user -d learning_analytics -c "\d student_attempts" | grep "ip_address"
  79. echo ""
  80. echo "检查 partial_score 字段:"
  81. docker exec learning_analytics_postgres psql -U rag_user -d learning_analytics -c "\d student_attempts" | grep "partial_score"
  82. fi
  83. echo ""
  84. echo "=========================================="
  85. echo "修复完成!现在可以正常提交评分。"
  86. echo "=========================================="