#!/bin/bash # 数据库连接问题修复脚本 echo "=== 数据库连接问题修复工具 ===" # 检查当前目录 if [ ! -f "main.py" ]; then echo "错误: 请在包含main.py的项目根目录下运行此脚本" exit 1 fi echo "当前目录: $(pwd)" # 1. 检查.env文件 echo "" echo "1. 检查环境配置..." if [ -f ".env" ]; then echo "✓ .env 文件存在" echo "当前数据库配置:" grep "DATABASE_URL" .env || echo "DATABASE_URL 未设置" else echo "⚠ .env 文件不存在,正在创建..." cat > .env << EOF # 基础配置 ENVIRONMENT=production DEBUG=false # 数据库配置 - 请根据实际情况修改 DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db # Redis配置 REDIS_URL=redis://localhost:6379 # JWT配置 JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-$(date +%s) JWT_ALGORITHM=HS256 JWT_EXPIRE_MINUTES=30 # 文件上传配置 UPLOAD_DIR=uploads MAX_FILE_SIZE=10485760 # CORS配置 ALLOWED_HOSTS=["*"] EOF echo "✓ .env 文件创建成功" fi # 2. 测试数据库连接 echo "" echo "2. 测试数据库连接..." # 创建测试脚本 cat > test_db_connection.py << 'EOF' #!/usr/bin/env python3 import sys import os sys.path.insert(0, '.') try: from app.core.config import settings print(f"✓ 配置加载成功") print(f"数据库URL: {settings.DATABASE_URL}") # 测试数据库连接 from sqlalchemy import create_engine, text engine = create_engine(settings.DATABASE_URL) with engine.connect() as conn: result = conn.execute(text("SELECT VERSION()")) version = result.fetchone()[0] print(f"✓ 数据库连接成功: MySQL {version}") # 检查数据库是否存在 result = conn.execute(text("SHOW DATABASES LIKE 'mytest_db'")) if result.fetchone(): print("✓ 数据库 'mytest_db' 存在") else: print("⚠ 数据库 'mytest_db' 不存在,需要创建") except ImportError as e: print(f"✗ 导入错误: {e}") print("请确保已安装所需依赖: pip install sqlalchemy pymysql") sys.exit(1) except Exception as e: print(f"✗ 数据库连接失败: {e}") print("") print "可能的原因:" print "1. 数据库服务器未启动" print "2. 网络连接问题" print "3. 用户名或密码错误" print "4. 数据库不存在" print "5. 防火墙阻止连接" sys.exit(1) EOF python3 test_db_connection.py if [ $? -eq 0 ]; then echo "" echo "✓ 数据库连接测试通过" else echo "" echo "✗ 数据库连接测试失败" echo "" echo "解决方案:" echo "1. 检查数据库服务是否运行" echo "2. 验证数据库连接参数" echo "3. 确认网络连通性" echo "" echo "请手动编辑 .env 文件中的 DATABASE_URL" echo "格式: mysql+pymysql://用户名:密码@主机:端口/数据库名" exit 1 fi # 3. 检查Docker环境 echo "" echo "3. 检查Docker配置..." if [ -f "docker-compose.yml" ]; then echo "✓ 发现 docker-compose.yml 文件" echo "检查Docker数据库配置..." if grep -q "mysql:" docker-compose.yml; then echo "⚠ 检测到Docker MySQL配置" echo "如果使用Docker Compose,请确保:" echo "1. 数据库服务已启动: docker-compose up -d mysql" echo "2. 数据库主机名应为 'mysql' (服务名)" echo "3. 确认网络配置正确" echo "" echo "Docker数据库连接配置示例:" echo "DATABASE_URL=mysql+pymysql://root:password@mysql:3306/mytest_db" fi fi # 4. 提供修复建议 echo "" echo "4. 修复建议..." echo "根据错误信息,应用尝试连接到 'mysql' 主机,但配置中是IP地址。" echo "请检查以下配置:" echo "" echo "选项1: 使用外部数据库 (推荐)" echo "DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db" echo "" echo "选项2: 使用Docker数据库" echo "DATABASE_URL=mysql+pymysql://root:password@mysql:3306/mytest_db" echo "" echo "选项3: 使用本地数据库" echo "DATABASE_URL=mysql+pymysql://root:password@localhost:3306/mytest_db" echo "" # 5. 自动修复.env文件 echo "5. 自动修复配置..." if [ -f ".env" ]; then # 备份原文件 cp .env .env.backup.$(date +%Y%m%d_%H%M%S) # 确保使用正确的数据库URL if grep -q "DATABASE_URL.*mysql.*mysql:" .env; then echo "检测到Docker主机名配置,更新为外部数据库..." sed -i 's|DATABASE_URL=mysql+pymysql://.*@mysql:.*|DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db|' .env elif ! grep -q "DATABASE_URL.*101.126.85.76" .env; then echo "更新数据库连接配置..." sed -i 's|DATABASE_URL=.*|DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db|' .env fi echo "✓ 数据库配置已更新" fi # 6. 重启应用提示 echo "" echo "6. 重启应用..." echo "配置更新完成,请重启应用以使配置生效" echo "" echo "重启方式:" echo "1. 停止当前应用 (Ctrl+C)" echo "2. 重新启动: python main.py" echo "3. 或者使用启动脚本: ./start_app.sh" echo "" echo "=== 数据库连接修复完成 ===" echo "" echo "如果问题仍然存在,请:" echo "1. 确认数据库服务器地址正确: 101.126.85.76:3306" echo "2. 确认用户名密码正确: mytest_db / mytest_db" echo "3. 确认数据库名称正确: mytest_db" echo "4. 测试网络连通性: telnet 101.126.85.76 3306"