ForcePilot/backend/test/test_mysql_connection.py
Wenjie Zhang 410dd47c14 refactor: 将后端代码迁移至 backend 目录
- 将 server/, src/, scripts/, test/ 等目录移动到 backend/ 目录下
- 使用 git rename 保留文件历史记录
- 更新 docker-compose.yml 和 api.Dockerfile 配置

WIP: 项目结构重构进行中
2026-03-24 11:08:12 +08:00

207 lines
6.9 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 数据库连接验证脚本
"""
import os
# 添加项目根目录到 Python 路径
# sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent.parent.parent))
def load_env_file(env_file=".env"):
"""加载 .env 文件"""
env_vars = {}
if os.path.exists(env_file):
with open(env_file, encoding="utf-8") as f:
for line in f:
line = line.strip()
if line and not line.startswith("#") and "=" in line:
key, value = line.split("=", 1)
env_vars[key] = value.strip("\"'")
return env_vars
def test_mysql_connection():
"""测试 MySQL 连接"""
print("=== MySQL 数据库连接验证 ===\n")
# 加载环境变量
env_vars = load_env_file()
# 检查必需的环境变量
required_vars = ["MYSQL_HOST", "MYSQL_USER", "MYSQL_PASSWORD", "MYSQL_DATABASE"]
missing_vars = []
for var in required_vars:
if var not in env_vars:
missing_vars.append(var)
if missing_vars:
print(f"❌ 缺少必需的环境变量: {', '.join(missing_vars)}")
print("\n请在 .env 文件中设置以下变量:")
for var in missing_vars:
print(f" {var}=your_value")
return False
# 显示配置信息(隐藏密码)
print("📋 数据库配置:")
print(f" Host: {env_vars.get('MYSQL_HOST', 'Not set')}")
print(f" User: {env_vars.get('MYSQL_USER', 'Not set')}")
print(f" Database: {env_vars.get('MYSQL_DATABASE', 'Not set')}")
print(f" Port: {env_vars.get('MYSQL_PORT', '3306')}")
print(f" Charset: {env_vars.get('MYSQL_CHARSET', 'utf8mb4')}")
print()
try:
# 导入 MySQL 连接管理器
from yuxi.agents.common.toolkits.mysql.connection import MySQLConnectionManager
# 创建连接配置
mysql_config = {
"host": env_vars["MYSQL_HOST"],
"user": env_vars["MYSQL_USER"],
"password": env_vars["MYSQL_PASSWORD"],
"database": env_vars["MYSQL_DATABASE"],
"port": int(env_vars.get("MYSQL_PORT", "3306")),
"charset": env_vars.get("MYSQL_CHARSET", "utf8mb4"),
}
# 创建连接管理器
print("🔄 正在连接数据库...")
conn_manager = MySQLConnectionManager(mysql_config)
# 测试连接
with conn_manager.get_cursor() as cursor:
# 测试基本连接
cursor.execute("SELECT 1 as test")
result = cursor.fetchone()
if result and result["test"] == 1:
print("✅ 数据库连接成功!")
# 获取数据库版本
cursor.execute("SELECT VERSION() as version")
version_info = cursor.fetchone()
print(f"📊 MySQL 版本: {version_info['version']}")
# 获取当前数据库
cursor.execute("SELECT DATABASE() as db_name")
db_info = cursor.fetchone()
print(f"🗄️ 当前数据库: {db_info['db_name']}")
# 获取表数量
cursor.execute("SHOW TABLES")
tables = cursor.fetchall()
print(f"📋 表数量: {len(tables)}")
if tables:
print("\n📝 数据库表列表:")
for i, table in enumerate(tables[:10]): # 只显示前10个表
table_name = list(table.values())[0]
print(f" {i + 1}. {table_name}")
if len(tables) > 10:
print(f" ... 还有 {len(tables) - 10} 个表未显示")
return True
else:
print("❌ 数据库连接测试失败")
return False
except ImportError as e:
print(f"❌ 导入错误: {e}")
print("请确保已安装 pymysql 依赖")
return False
except Exception as e:
print(f"❌ 连接失败: {e}")
# 提供故障排除建议
print("\n💡 故障排除建议:")
print("1. 检查数据库服务是否正在运行")
print("2. 验证主机地址和端口是否正确")
print("3. 确认用户名和密码是否正确")
print("4. 检查数据库是否存在")
print("5. 确认网络连接和防火墙设置")
return False
def test_tools():
"""测试 MySQL 工具是否正常工作"""
print("\n=== MySQL 工具测试 ===\n")
try:
from yuxi.agents.common.toolkits.mysql.tools import mysql_list_tables, mysql_describe_table, mysql_query
print("✅ MySQL 工具导入成功")
# 测试获取表名
print("\n🔄 测试获取表名...")
result = mysql_list_tables.invoke({})
if "失败" not in result and "错误" not in result:
print("✅ 获取表名工具正常")
else:
print(f"❌ 获取表名工具异常: {result}")
return False
# 如果有表,测试获取表结构
if "数据库中的表:" in result:
print("\n🔄 测试获取表结构...")
# 提取第一个表名
lines = result.split("\n")
for line in lines:
if "- " in line and "(" in line:
table_name = line.split("- ")[1].split(" ")[0]
break
else:
table_name = None
if table_name:
structure_result = mysql_describe_table.invoke({"table_name": table_name})
if "失败" not in structure_result and "错误" not in structure_result:
print("✅ 获取表结构工具正常")
else:
print(f"❌ 获取表结构工具异常: {structure_result}")
return False
# 测试简单查询
print("\n🔄 测试SQL查询...")
query_result = mysql_query.invoke({"sql": f"SELECT COUNT(*) as total FROM `{table_name}`"})
if "失败" not in query_result and "错误" not in query_result:
print("✅ SQL查询工具正常")
else:
print(f"❌ SQL查询工具异常: {query_result}")
return False
return True
except Exception as e:
print(f"❌ 工具测试失败: {e}")
return False
def main():
"""主函数"""
print("MySQL 数据库连接和工具验证脚本")
print("=" * 50)
# 测试连接
connection_ok = test_mysql_connection()
if connection_ok:
# 测试工具
tools_ok = test_tools()
print("\n" + "=" * 50)
if connection_ok and tools_ok:
print("🎉 所有测试通过MySQL 工具包可以正常使用")
else:
print("❌ 部分测试失败,请检查配置")
else:
print("\n" + "=" * 50)
print("❌ 数据库连接失败,请检查配置")
if __name__ == "__main__":
main()