248 lines
6.0 KiB
Bash
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 "$@"
|