#!/bin/bash # ================================================================================ # Mall SQL 自动部署脚本 # ================================================================================ # 用途:自动执行商城数据库脚本 # 使用:./deploy.sh [选项] # # 选项: # --full 完整部署(删除重建) # --upgrade 增量升级 # --check 仅检查数据库状态 # --test 创建测试数据 # --help 显示帮助 # ================================================================================ set -e # 遇到错误立即退出 # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 默认配置 DB_HOST="${DB_HOST:-localhost}" DB_PORT="${DB_PORT:-5432}" DB_NAME="${DB_NAME:-akmon}" DB_USER="${DB_USER:-postgres}" SCHEMA_DIR="schemas" MIGRATION_DIR="migrations" TEST_DIR="tests" SUBSCRIPTION_DIR="subscription" # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 显示帮助 show_help() { cat << EOF Mall SQL 自动部署脚本 用法: $0 [选项] 选项: --full 完整部署(删除重建数据库) --upgrade 增量升级(保留现有数据) --check 检查数据库状态 --test 创建测试数据 --subscription 部署订阅系统 --help 显示此帮助信息 环境变量: DB_HOST 数据库主机 (默认: localhost) DB_PORT 数据库端口 (默认: 5432) DB_NAME 数据库名称 (默认: akmon) DB_USER 数据库用户 (默认: postgres) 示例: # 完整部署 $0 --full # 增量升级 $0 --upgrade # 检查状态 $0 --check # 使用自定义数据库 DB_HOST=prod.example.com DB_NAME=akmon_prod $0 --upgrade EOF } # 检查数据库连接 check_connection() { log_info "检查数据库连接..." if psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c '\q' 2>/dev/null; then log_success "数据库连接成功" return 0 else log_error "无法连接到数据库: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME" return 1 fi } # 执行SQL文件 execute_sql() { local sql_file=$1 local description=$2 log_info "执行: $description" if [ ! -f "$sql_file" ]; then log_error "文件不存在: $sql_file" return 1 fi if psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$sql_file"; then log_success "完成: $description" return 0 else log_error "失败: $description" return 1 fi } # 检查数据库状态 check_database() { log_info "检查数据库状态..." execute_sql "$TEST_DIR/mall_database_check.sql" "数据库状态检查" } # 完整部署 deploy_full() { log_warning "==========================================" log_warning "完整部署将重建所有商城表!" log_warning "==========================================" read -p "确认继续? (yes/no): " confirm if [ "$confirm" != "yes" ]; then log_info "已取消" return 0 fi log_info "开始完整部署..." # 1. 完整数据库 execute_sql "$SCHEMA_DIR/complete_mall_database.sql" "创建商城核心表" # 2. 商品表补充 execute_sql "$SCHEMA_DIR/product_database.sql" "创建商品补充表" # 3. SEO和安全 execute_sql "$SCHEMA_DIR/mall_seo_security.sql" "配置SEO和安全策略" # 4. 订阅系统 execute_sql "$SUBSCRIPTION_DIR/create_mall_subscription_tables.sql" "创建订阅表" execute_sql "$SUBSCRIPTION_DIR/subscription_guard_trigger.sql" "创建订阅触发器" execute_sql "$SUBSCRIPTION_DIR/subscription_rls_policies.sql" "创建订阅RLS策略" log_success "完整部署完成!" log_info "接下来可以运行: $0 --test" } # 增量升级 deploy_upgrade() { log_info "开始增量升级..." # 1. 先检查 check_database # 2. 执行升级 execute_sql "$MIGRATION_DIR/mall_alter_upgrade.sql" "增量升级" # 3. 验证 execute_sql "$TEST_DIR/validation_test.sql" "数据完整性验证" log_success "增量升级完成!" } # 创建测试数据 create_test_data() { log_info "创建测试数据..." # 1. 先创建Auth用户 execute_sql "$TEST_DIR/create_supabase_auth_users.sql" "创建测试用户" # 2. 创建模拟数据 execute_sql "$TEST_DIR/mock_data_insert.sql" "创建模拟数据" # 3. 验证 execute_sql "$TEST_DIR/verify_mock_data_fix.sql" "验证测试数据" log_success "测试数据创建完成!" } # 部署订阅系统 deploy_subscription() { log_info "部署订阅系统..." execute_sql "$SUBSCRIPTION_DIR/create_mall_subscription_tables.sql" "创建订阅表" execute_sql "$SUBSCRIPTION_DIR/subscription_guard_trigger.sql" "创建订阅触发器" execute_sql "$SUBSCRIPTION_DIR/subscription_rls_policies.sql" "创建订阅RLS策略" log_success "订阅系统部署完成!" } # 主函数 main() { echo "==========================================" echo " Mall SQL 自动部署脚本" echo "==========================================" echo "数据库: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME" echo "==========================================" echo "" # 检查连接 if ! check_connection; then exit 1 fi # 解析参数 case "${1:-}" in --full) deploy_full ;; --upgrade) deploy_upgrade ;; --check) check_database ;; --test) create_test_data ;; --subscription) deploy_subscription ;; --help|-h) show_help ;; *) log_error "未知选项: ${1:-}" echo "" show_help exit 1 ;; esac } # 运行主函数 main "$@"