rebuild_database.sh 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #!/bin/bash
  2. # ============================================
  3. # 数据库重建脚本
  4. # 删除所有表并重新初始化
  5. # ============================================
  6. set -e
  7. # 颜色定义
  8. RED='\033[0;31m'
  9. GREEN='\033[0;32m'
  10. YELLOW='\033[1;33m'
  11. BLUE='\033[0;34m'
  12. NC='\033[0m'
  13. # 数据库配置(根据实际情况修改)
  14. DB_HOST=${DB_HOST:-localhost}
  15. DB_PORT=${DB_PORT:-5432}
  16. DB_NAME=${DB_NAME:-lingyue_zhibao}
  17. DB_USER=${DB_USER:-postgres}
  18. log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
  19. log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
  20. log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
  21. log_title() { echo -e "\n${BLUE}========== $1 ==========${NC}\n"; }
  22. # 获取脚本所在目录
  23. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  24. SQL_DIR="${SCRIPT_DIR}"
  25. # 检查 SQL 文件是否存在
  26. check_sql_files() {
  27. log_title "检查 SQL 文件"
  28. local missing=false
  29. for file in init.sql supplement_tables.sql rag_tables.sql; do
  30. if [ -f "${SQL_DIR}/${file}" ]; then
  31. log_info "找到: ${file}"
  32. else
  33. log_error "缺失: ${file}"
  34. missing=true
  35. fi
  36. done
  37. if [ "$missing" = true ]; then
  38. log_error "请确保在 backend/sql 目录下运行此脚本"
  39. exit 1
  40. fi
  41. }
  42. # 删除所有表
  43. drop_all_tables() {
  44. log_title "删除所有表"
  45. log_warn "这将删除数据库中的所有表和数据!"
  46. read -p "是否继续?(yes/no): " confirm
  47. if [ "$confirm" != "yes" ]; then
  48. log_info "操作已取消"
  49. exit 0
  50. fi
  51. log_info "开始删除表..."
  52. # 删除所有表的 SQL
  53. PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
  54. -- 禁用外键约束检查
  55. SET session_replication_role = 'replica';
  56. -- 删除所有表
  57. DO \$\$
  58. DECLARE
  59. r RECORD;
  60. BEGIN
  61. FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public')
  62. LOOP
  63. EXECUTE 'DROP TABLE IF EXISTS public.' || quote_ident(r.tablename) || ' CASCADE';
  64. RAISE NOTICE 'Dropped table: %', r.tablename;
  65. END LOOP;
  66. END
  67. \$\$;
  68. -- 恢复外键约束检查
  69. SET session_replication_role = 'origin';
  70. -- 显示剩余的表
  71. SELECT tablename FROM pg_tables WHERE schemaname = 'public';
  72. EOF
  73. log_info "所有表已删除"
  74. }
  75. # 初始化基础表
  76. init_base_tables() {
  77. log_title "初始化基础表 (init.sql)"
  78. PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/init.sql"
  79. if [ $? -eq 0 ]; then
  80. log_info "基础表初始化成功"
  81. else
  82. log_error "基础表初始化失败"
  83. exit 1
  84. fi
  85. }
  86. # 初始化补充表
  87. init_supplement_tables() {
  88. log_title "初始化补充表 (supplement_tables.sql)"
  89. PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/supplement_tables.sql"
  90. if [ $? -eq 0 ]; then
  91. log_info "补充表初始化成功"
  92. else
  93. log_error "补充表初始化失败"
  94. exit 1
  95. fi
  96. }
  97. # 初始化 RAG 表
  98. init_rag_tables() {
  99. log_title "初始化 RAG 表 (rag_tables.sql)"
  100. PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/rag_tables.sql" 2>&1
  101. if [ $? -eq 0 ]; then
  102. log_info "RAG 表初始化成功"
  103. else
  104. log_warn "RAG 表初始化可能失败(如果未安装 pgvector 扩展是正常的)"
  105. fi
  106. }
  107. # 验证表创建
  108. verify_tables() {
  109. log_title "验证表创建"
  110. log_info "查询所有表..."
  111. PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
  112. SELECT
  113. schemaname,
  114. tablename,
  115. pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
  116. FROM pg_tables
  117. WHERE schemaname = 'public'
  118. ORDER BY tablename;
  119. EOF
  120. log_info "表统计..."
  121. PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
  122. SELECT COUNT(*) as table_count FROM pg_tables WHERE schemaname = 'public';
  123. EOF
  124. }
  125. # 显示帮助
  126. show_help() {
  127. cat <<EOF
  128. 数据库重建脚本
  129. 用法: ./rebuild_database.sh [选项]
  130. 环境变量:
  131. DB_HOST 数据库主机 (默认: localhost)
  132. DB_PORT 数据库端口 (默认: 5432)
  133. DB_NAME 数据库名称 (默认: lingyue_zhibao)
  134. DB_USER 数据库用户 (默认: postgres)
  135. DB_PASSWORD 数据库密码 (可选,如果未设置将提示输入)
  136. 示例:
  137. # 使用默认配置
  138. ./rebuild_database.sh
  139. # 指定数据库配置
  140. DB_HOST=localhost DB_USER=postgres DB_PASSWORD=123456 ./rebuild_database.sh
  141. # 仅初始化新表(不删除)
  142. ./init_supplement_only.sh
  143. 注意:
  144. - 此脚本会删除所有现有表和数据
  145. - 确保已备份重要数据
  146. - 需要数据库管理员权限
  147. 执行步骤:
  148. 1. 删除所有表
  149. 2. 执行 init.sql(基础表)
  150. 3. 执行 supplement_tables.sql(补充表)
  151. 4. 执行 rag_tables.sql(RAG表)
  152. 5. 验证表创建
  153. EOF
  154. }
  155. # 主函数
  156. main() {
  157. if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
  158. show_help
  159. exit 0
  160. fi
  161. log_title "数据库重建脚本"
  162. echo "数据库: ${DB_NAME}"
  163. echo "主机: ${DB_HOST}:${DB_PORT}"
  164. echo "用户: ${DB_USER}"
  165. echo ""
  166. check_sql_files
  167. drop_all_tables
  168. init_base_tables
  169. init_supplement_tables
  170. init_rag_tables
  171. verify_tables
  172. log_title "数据库重建完成"
  173. log_info "所有表已创建并验证"
  174. }
  175. main "$@"