소스 검색

feat: 添加数据库重建和补充表初始化脚本

- rebuild_database.sh: 删除所有表并重新初始化
- init_supplement_only.sh: 仅初始化补充表(不删除现有表)

使用方法:
1. 完整重建:./backend/sql/rebuild_database.sh
2. 仅添加补充表:./backend/sql/init_supplement_only.sh
何文松 1 개월 전
부모
커밋
c849aa6960
2개의 변경된 파일275개의 추가작업 그리고 0개의 파일을 삭제
  1. 55 0
      backend/sql/init_supplement_only.sh
  2. 220 0
      backend/sql/rebuild_database.sh

+ 55 - 0
backend/sql/init_supplement_only.sh

@@ -0,0 +1,55 @@
+#!/bin/bash
+
+# ============================================
+# 仅初始化补充表(不删除现有表)
+# ============================================
+
+set -e
+
+# 颜色定义
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+NC='\033[0m'
+
+# 数据库配置
+DB_HOST=${DB_HOST:-localhost}
+DB_PORT=${DB_PORT:-5432}
+DB_NAME=${DB_NAME:-lingyue_zhibao}
+DB_USER=${DB_USER:-postgres}
+
+log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
+log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
+log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
+log_title() { echo -e "\n${BLUE}========== $1 ==========${NC}\n"; }
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+SQL_DIR="${SCRIPT_DIR}"
+
+log_title "初始化补充表"
+echo "数据库: ${DB_NAME}"
+echo "主机: ${DB_HOST}:${DB_PORT}"
+echo "用户: ${DB_USER}"
+echo ""
+
+log_info "执行 supplement_tables.sql..."
+PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/supplement_tables.sql"
+
+if [ $? -eq 0 ]; then
+    log_info "补充表初始化成功"
+    
+    log_info "验证表创建..."
+    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
+SELECT tablename 
+FROM pg_tables 
+WHERE schemaname = 'public' 
+AND tablename IN ('text_storage', 'vector_embeddings', 'knowledge_base', 'rag_sessions', 'rag_messages')
+ORDER BY tablename;
+EOF
+    
+    log_title "完成"
+else
+    log_error "补充表初始化失败"
+    exit 1
+fi

+ 220 - 0
backend/sql/rebuild_database.sh

@@ -0,0 +1,220 @@
+#!/bin/bash
+
+# ============================================
+# 数据库重建脚本
+# 删除所有表并重新初始化
+# ============================================
+
+set -e
+
+# 颜色定义
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+NC='\033[0m'
+
+# 数据库配置(根据实际情况修改)
+DB_HOST=${DB_HOST:-localhost}
+DB_PORT=${DB_PORT:-5432}
+DB_NAME=${DB_NAME:-lingyue_zhibao}
+DB_USER=${DB_USER:-postgres}
+
+log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
+log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
+log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
+log_title() { echo -e "\n${BLUE}========== $1 ==========${NC}\n"; }
+
+# 获取脚本所在目录
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+SQL_DIR="${SCRIPT_DIR}"
+
+# 检查 SQL 文件是否存在
+check_sql_files() {
+    log_title "检查 SQL 文件"
+    
+    local missing=false
+    
+    for file in init.sql supplement_tables.sql rag_tables.sql; do
+        if [ -f "${SQL_DIR}/${file}" ]; then
+            log_info "找到: ${file}"
+        else
+            log_error "缺失: ${file}"
+            missing=true
+        fi
+    done
+    
+    if [ "$missing" = true ]; then
+        log_error "请确保在 backend/sql 目录下运行此脚本"
+        exit 1
+    fi
+}
+
+# 删除所有表
+drop_all_tables() {
+    log_title "删除所有表"
+    
+    log_warn "这将删除数据库中的所有表和数据!"
+    read -p "是否继续?(yes/no): " confirm
+    
+    if [ "$confirm" != "yes" ]; then
+        log_info "操作已取消"
+        exit 0
+    fi
+    
+    log_info "开始删除表..."
+    
+    # 删除所有表的 SQL
+    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
+-- 禁用外键约束检查
+SET session_replication_role = 'replica';
+
+-- 删除所有表
+DO \$\$
+DECLARE
+    r RECORD;
+BEGIN
+    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public')
+    LOOP
+        EXECUTE 'DROP TABLE IF EXISTS public.' || quote_ident(r.tablename) || ' CASCADE';
+        RAISE NOTICE 'Dropped table: %', r.tablename;
+    END LOOP;
+END
+\$\$;
+
+-- 恢复外键约束检查
+SET session_replication_role = 'origin';
+
+-- 显示剩余的表
+SELECT tablename FROM pg_tables WHERE schemaname = 'public';
+EOF
+    
+    log_info "所有表已删除"
+}
+
+# 初始化基础表
+init_base_tables() {
+    log_title "初始化基础表 (init.sql)"
+    
+    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/init.sql"
+    
+    if [ $? -eq 0 ]; then
+        log_info "基础表初始化成功"
+    else
+        log_error "基础表初始化失败"
+        exit 1
+    fi
+}
+
+# 初始化补充表
+init_supplement_tables() {
+    log_title "初始化补充表 (supplement_tables.sql)"
+    
+    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/supplement_tables.sql"
+    
+    if [ $? -eq 0 ]; then
+        log_info "补充表初始化成功"
+    else
+        log_error "补充表初始化失败"
+        exit 1
+    fi
+}
+
+# 初始化 RAG 表
+init_rag_tables() {
+    log_title "初始化 RAG 表 (rag_tables.sql)"
+    
+    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/rag_tables.sql" 2>&1
+    
+    if [ $? -eq 0 ]; then
+        log_info "RAG 表初始化成功"
+    else
+        log_warn "RAG 表初始化可能失败(如果未安装 pgvector 扩展是正常的)"
+    fi
+}
+
+# 验证表创建
+verify_tables() {
+    log_title "验证表创建"
+    
+    log_info "查询所有表..."
+    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
+SELECT 
+    schemaname,
+    tablename,
+    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
+FROM pg_tables 
+WHERE schemaname = 'public'
+ORDER BY tablename;
+EOF
+    
+    log_info "表统计..."
+    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
+SELECT COUNT(*) as table_count FROM pg_tables WHERE schemaname = 'public';
+EOF
+}
+
+# 显示帮助
+show_help() {
+    cat <<EOF
+数据库重建脚本
+
+用法: ./rebuild_database.sh [选项]
+
+环境变量:
+    DB_HOST         数据库主机 (默认: localhost)
+    DB_PORT         数据库端口 (默认: 5432)
+    DB_NAME         数据库名称 (默认: lingyue_zhibao)
+    DB_USER         数据库用户 (默认: postgres)
+    DB_PASSWORD     数据库密码 (可选,如果未设置将提示输入)
+
+示例:
+    # 使用默认配置
+    ./rebuild_database.sh
+
+    # 指定数据库配置
+    DB_HOST=localhost DB_USER=postgres DB_PASSWORD=123456 ./rebuild_database.sh
+
+    # 仅初始化新表(不删除)
+    ./init_supplement_only.sh
+
+注意:
+    - 此脚本会删除所有现有表和数据
+    - 确保已备份重要数据
+    - 需要数据库管理员权限
+
+执行步骤:
+    1. 删除所有表
+    2. 执行 init.sql(基础表)
+    3. 执行 supplement_tables.sql(补充表)
+    4. 执行 rag_tables.sql(RAG表)
+    5. 验证表创建
+
+EOF
+}
+
+# 主函数
+main() {
+    if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
+        show_help
+        exit 0
+    fi
+    
+    log_title "数据库重建脚本"
+    echo "数据库: ${DB_NAME}"
+    echo "主机: ${DB_HOST}:${DB_PORT}"
+    echo "用户: ${DB_USER}"
+    echo ""
+    
+    check_sql_files
+    drop_all_tables
+    init_base_tables
+    init_supplement_tables
+    init_rag_tables
+    verify_tables
+    
+    log_title "数据库重建完成"
+    log_info "所有表已创建并验证"
+}
+
+main "$@"