first commit
This commit is contained in:
181
test_url_encoding.py
Normal file
181
test_url_encoding.py
Normal file
@@ -0,0 +1,181 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
URL编码测试脚本
|
||||
|
||||
测试密码中包含特殊字符(如@符号)的URL编码处理
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
from urllib.parse import quote_plus
|
||||
|
||||
# 添加项目根目录到Python路径
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from database_manager import DatabaseManager
|
||||
from config import DatabaseConfig
|
||||
|
||||
def test_url_encoding():
|
||||
"""
|
||||
测试URL编码功能
|
||||
"""
|
||||
print("🔧 URL编码测试")
|
||||
print("=" * 50)
|
||||
|
||||
# 测试密码编码
|
||||
test_passwords = [
|
||||
"sqlserver@7740",
|
||||
"password@123",
|
||||
"user#pass",
|
||||
"test&password",
|
||||
"simple123"
|
||||
]
|
||||
|
||||
print("📋 密码编码测试:")
|
||||
for password in test_passwords:
|
||||
encoded = quote_plus(password)
|
||||
print(f" 原始密码: {password}")
|
||||
print(f" 编码后: {encoded}")
|
||||
print()
|
||||
|
||||
# 测试SQL Server连接URL构建
|
||||
print("🔗 SQL Server连接URL构建测试:")
|
||||
|
||||
db_manager = DatabaseManager()
|
||||
|
||||
# 获取配置
|
||||
config = DatabaseConfig.get_config("sqlserver")
|
||||
|
||||
try:
|
||||
# 构建连接URL
|
||||
connection_url = db_manager._build_connection_url(
|
||||
db_type="sqlserver",
|
||||
host=config["host"],
|
||||
port=config["port"],
|
||||
username=config["username"],
|
||||
password=config["password"],
|
||||
database=config["database"]
|
||||
)
|
||||
|
||||
print(f"✅ 连接URL构建成功:")
|
||||
print(f" {connection_url}")
|
||||
|
||||
# 验证URL中不包含原始的@符号(除了用户名密码分隔符)
|
||||
if "sqlserver@7740" in connection_url:
|
||||
print("❌ 错误: URL中仍包含未编码的密码")
|
||||
return False
|
||||
elif "sqlserver%407740" in connection_url:
|
||||
print("✅ 正确: 密码已正确编码")
|
||||
return True
|
||||
else:
|
||||
print("⚠️ 警告: 无法确定编码状态")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 连接URL构建失败: {str(e)}")
|
||||
return False
|
||||
|
||||
def test_direct_connection():
|
||||
"""
|
||||
测试直接数据库连接
|
||||
"""
|
||||
print("\n🔌 直接连接测试")
|
||||
print("=" * 50)
|
||||
|
||||
try:
|
||||
# 获取配置
|
||||
config = DatabaseConfig.get_config("sqlserver")
|
||||
|
||||
print(f"📋 连接配置:")
|
||||
print(f" 主机: {config['host']}")
|
||||
print(f" 端口: {config['port']}")
|
||||
print(f" 数据库: {config['database']}")
|
||||
print(f" 用户名: {config['username']}")
|
||||
print(f" 密码: {'*' * len(config['password'])}")
|
||||
|
||||
# 创建数据库管理器
|
||||
db_manager = DatabaseManager()
|
||||
|
||||
# 尝试创建连接
|
||||
print("\n正在尝试连接...")
|
||||
connection_id = db_manager.create_connection(
|
||||
db_type="sqlserver",
|
||||
host=config["host"],
|
||||
port=config["port"],
|
||||
username=config["username"],
|
||||
password=config["password"],
|
||||
database=config["database"]
|
||||
)
|
||||
|
||||
print(f"✅ SQL Server连接成功! 连接ID: {connection_id}")
|
||||
|
||||
# 测试查询
|
||||
try:
|
||||
result = db_manager.execute_query(connection_id, "SELECT 1 as test_value")
|
||||
print(f"✅ 查询测试成功: {result}")
|
||||
|
||||
# 获取数据库版本
|
||||
version_result = db_manager.execute_query(connection_id, "SELECT @@VERSION as version")
|
||||
if version_result:
|
||||
version_info = version_result[0]['version']
|
||||
# 只显示版本信息的前100个字符
|
||||
print(f"📋 数据库版本: {version_info[:100]}...")
|
||||
|
||||
except Exception as e:
|
||||
print(f"⚠️ 查询测试失败: {str(e)}")
|
||||
|
||||
# 关闭连接
|
||||
db_manager.close_connection(connection_id)
|
||||
print("✅ 连接已关闭")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 连接测试失败: {str(e)}")
|
||||
|
||||
# 分析错误类型
|
||||
error_str = str(e)
|
||||
if "7740@192.168.11.200" in error_str:
|
||||
print("\n🔍 错误分析: 密码中的@符号仍未正确处理")
|
||||
print(" 建议检查URL编码逻辑")
|
||||
elif "Unable to connect" in error_str:
|
||||
print("\n🔍 错误分析: 无法连接到SQL Server")
|
||||
print(" 可能原因:")
|
||||
print(" 1. SQL Server服务未启动")
|
||||
print(" 2. 网络连接问题")
|
||||
print(" 3. 防火墙阻止连接")
|
||||
print(" 4. 用户名或密码错误")
|
||||
|
||||
return False
|
||||
|
||||
def main():
|
||||
"""
|
||||
主函数
|
||||
"""
|
||||
print("🧪 数据库连接URL编码修复验证")
|
||||
print("=" * 60)
|
||||
|
||||
# 1. URL编码测试
|
||||
url_test_success = test_url_encoding()
|
||||
|
||||
# 2. 直接连接测试
|
||||
connection_test_success = test_direct_connection()
|
||||
|
||||
# 总结
|
||||
print("\n" + "=" * 60)
|
||||
print("📊 测试结果总结:")
|
||||
print(f" URL编码: {'✅ 通过' if url_test_success else '❌ 失败'}")
|
||||
print(f" 连接测试: {'✅ 通过' if connection_test_success else '❌ 失败'}")
|
||||
|
||||
if url_test_success and connection_test_success:
|
||||
print("\n🎉 所有测试通过! URL编码修复成功")
|
||||
print(" 现在可以正常使用包含特殊字符的密码了")
|
||||
elif url_test_success and not connection_test_success:
|
||||
print("\n⚠️ URL编码修复成功,但连接仍有问题")
|
||||
print(" 请检查SQL Server配置和网络连接")
|
||||
else:
|
||||
print("\n❌ 测试失败,需要进一步检查代码")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user