Kamixitong/verify_mysql_config.py
2025-11-11 23:04:01 +08:00

224 lines
5.7 KiB
Python
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.

#!/usr/bin/env python3
"""
验证MySQL配置脚本
检查:
1. .env文件是否存在
2. DATABASE_URL配置是否正确
3. MySQL连接是否正常
4. 数据库表结构是否正确
"""
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
def check_env_file():
"""检查.env文件"""
print("\n" + "=" * 60)
print("检查.env文件")
print("=" * 60)
env_file = '.env'
if not os.path.exists(env_file):
print(f"{env_file} 文件不存在")
print(f" 请确保在项目根目录创建 {env_file} 文件")
return None
print(f"{env_file} 文件存在")
# 读取DATABASE_URL
db_url = None
with open(env_file, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line.startswith('DATABASE_URL='):
db_url = line.split('=', 1)[1].strip()
print(f"✅ DATABASE_URL已配置")
print(f" {db_url}")
break
if not db_url:
print("❌ 未找到DATABASE_URL配置")
print(" 请在.env文件中添加: DATABASE_URL=mysql+pymysql://...")
return db_url
def check_dependencies():
"""检查依赖"""
print("\n" + "=" * 60)
print("检查依赖")
print("=" * 60)
missing = []
try:
import pymysql
print(f"✅ PyMySQL (版本: {pymysql.__version__})")
except ImportError:
print("❌ PyMySQL 未安装")
missing.append("PyMySQL")
try:
import dotenv
print(f"✅ python-dotenv (版本: {dotenv.__version__})")
except ImportError:
print("❌ python-dotenv 未安装")
missing.append("python-dotenv")
if missing:
print(f"\n⚠️ 请安装缺失的依赖:")
print(f" pip install {' '.join(missing)}")
return False
return True
def test_database():
"""测试数据库"""
print("\n" + "=" * 60)
print("测试数据库连接")
print("=" * 60)
try:
from app import create_app, db
app = create_app()
with app.app_context():
# 尝试连接
print("🔄 正在连接数据库...")
db.create_all()
print("✅ 数据库连接成功!")
# 显示数据库信息
print(f"\n数据库信息:")
print(f" URI: {app.config['SQLALCHEMY_DATABASE_URI']}")
# 检查表
print(f"\n检查数据库表:")
from sqlalchemy import inspect
inspector = inspect(db.engine)
tables = inspector.get_table_names()
print(f" 数据库表数量: {len(tables)}")
for table in tables:
print(f" - {table}")
return True
except Exception as e:
print(f"❌ 数据库连接失败")
print(f" 错误: {e}")
print(f"\n请检查:")
print(f" 1. MySQL服务是否运行")
print(f" 2. .env文件中的DATABASE_URL是否正确")
print(f" 3. 用户名和密码是否正确")
print(f" 4. 数据库是否存在")
return False
def check_admin_model():
"""检查Admin模型"""
print("\n" + "=" * 60)
print("检查Admin模型")
print("=" * 60)
try:
from app import create_app
from app.models import Admin
app = create_app()
with app.app_context():
# 检查字段
columns = [c.name for c in Admin.__table__.columns]
print(f"Admin表字段 ({len(columns)}个):")
for col in sorted(columns):
print(f" - {col}")
# 检查新字段
missing = []
if 'is_deleted' not in columns:
missing.append('is_deleted')
if 'delete_time' not in columns:
missing.append('delete_time')
if missing:
print(f"\n⚠️ 缺少字段: {', '.join(missing)}")
print(f" 请运行: python setup_mysql.py")
return False
print("\n✅ Admin模型结构正确")
return True
except Exception as e:
print(f"❌ 检查Admin模型失败: {e}")
return False
def show_config_example():
"""显示配置示例"""
print("\n" + "=" * 60)
print("配置示例")
print("=" * 60)
print("\n.env文件示例:")
print("-" * 60)
print("""# 环境配置
FLASK_ENV=development
FLASK_DEBUG=True
# 数据库配置 - MySQL
DATABASE_URL=mysql+pymysql://root:你的密码@localhost/kamaxitong
# 安全配置
SECRET_KEY=taiyi1224
AUTH_SECRET_KEY=taiyi1224
""")
print("-" * 60)
def main():
"""主函数"""
print("\n" + "=" * 60)
print("🔍 MySQL配置验证工具")
print("=" * 60)
success = True
# 1. 检查.env文件
db_url = check_env_file()
if not db_url:
show_config_example()
return 1
# 2. 检查依赖
if not check_dependencies():
success = False
# 3. 测试数据库
if success and not test_database():
success = False
# 4. 检查Admin模型
if success and not check_admin_model():
success = False
# 总结
print("\n" + "=" * 60)
if success:
print("✅ MySQL配置验证通过")
print("=" * 60)
print("\n📖 下一步:")
print(" python run.py")
print("\n🔑 默认管理员:")
print(" 用户名: admin")
print(" 密码: admin123456")
return 0
else:
print("❌ MySQL配置验证失败")
print("=" * 60)
print("\n💡 尝试自动修复:")
print(" python setup_mysql.py")
return 1
if __name__ == '__main__':
sys.exit(main())