Files
full-stack-doc/backend/fix_database_connection.sh
2025-10-14 20:05:29 +08:00

194 lines
5.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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