#!/bin/bash # H3C ONU设备管理系统 - 数据库初始化脚本 # 用于初始化数据库和创建基础数据 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 加载环境变量 if [ -f "../.env" ]; then set -a source ../.env set +a else echo -e "${RED}错误: .env 文件不存在${NC}" echo "请先复制 .env.example 为 .env 并配置数据库连接" exit 1 fi # 检查数据库连接字符串 if [ -z "$DATABASE_URL" ]; then echo -e "${RED}错误: DATABASE_URL 未设置${NC}" exit 1 fi # 从DATABASE_URL解析连接信息 parse_db_url() { local url="$1" # 格式: postgresql://username:password@host:port/database local pattern="postgresql://([^:]+):([^@]+)@([^:]+):([^/]+)/(.+)" if [[ $url =~ $pattern ]]; then DB_USER="${BASH_REMATCH[1]}" DB_PASSWORD="${BASH_REMATCH[2]}" DB_HOST="${BASH_REMATCH[3]}" DB_PORT="${BASH_REMATCH[4]}" DB_NAME="${BASH_REMATCH[5]}" else echo -e "${RED}错误: 无法解析DATABASE_URL${NC}" exit 1 fi } parse_db_url "$DATABASE_URL" # 函数:检查PostgreSQL连接 check_postgres_connection() { echo -e "${BLUE}检查PostgreSQL连接...${NC}" if PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c "SELECT 1;" > /dev/null 2>&1; then echo -e "${GREEN}✓ PostgreSQL连接成功${NC}" return 0 else echo -e "${RED}✗ PostgreSQL连接失败${NC}" return 1 fi } # 函数:检查数据库是否存在 check_database_exists() { echo -e "${BLUE}检查数据库 '$DB_NAME' 是否存在...${NC}" if PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1;" > /dev/null 2>&1; then echo -e "${GREEN}✓ 数据库已存在${NC}" return 0 else echo -e "${YELLOW}数据库不存在${NC}" return 1 fi } # 函数:创建数据库 create_database() { echo -e "${BLUE}创建数据库 '$DB_NAME'...${NC}" # 创建数据库 PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres < /dev/null return fi # 运行迁移 if command -v alembic &> /dev/null; then # 设置数据库URL环境变量 export DATABASE_URL # 初始化迁移(如果第一次运行) if [ ! -d "alembic/versions" ]; then echo -e "${BLUE}初始化Alembic迁移...${NC}" alembic init alembic # 需要手动配置alembic.ini中的sqlalchemy.url fi # 创建迁移版本 echo -e "${BLUE}创建迁移版本...${NC}" alembic revision --autogenerate -m "初始迁移" # 应用迁移 echo -e "${BLUE}应用迁移...${NC}" alembic upgrade head echo -e "${GREEN}✓ 数据库迁移完成${NC}" else echo -e "${YELLOW}警告: alembic 命令未找到,跳过迁移${NC}" echo "请安装: pip install alembic" fi # 返回原目录 cd - > /dev/null } # 函数:创建基础数据 create_base_data() { echo -e "${BLUE}创建基础数据...${NC}" # 检查数据库连接 if ! check_database_exists; then echo -e "${RED}错误: 数据库不存在,无法创建基础数据${NC}" return 1 fi # 创建基础数据SQL BASE_DATA_SQL=$(cat <