Files
medical-mall/mall_sql/deploy.sh
2026-01-30 16:11:23 +08:00

248 lines
6.0 KiB
Bash

#!/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 "$@"