# SQL Server 配置和初始化指南 ## 📋 概述 本指南详细说明了SQL Server数据库在ETL系统中的配置、连接和示例数据初始化过程。 ## ⚙️ 配置文件 ### 1. 环境变量配置 (.env) ```env # SQL Server 数据库配置 SQLSERVER_HOST=192.168.11.200 SQLSERVER_PORT=1433 SQLSERVER_USERNAME=sa SQLSERVER_PASSWORD=sqlserver@7740 SQLSERVER_DATABASE=test ``` ### 2. 配置文件 (config.py) ```python SQLSERVER_CONFIG = { "host": os.getenv("SQLSERVER_HOST", "localhost"), "port": int(os.getenv("SQLSERVER_PORT", "1433")), "username": os.getenv("SQLSERVER_USERNAME", "sa"), "password": os.getenv("SQLSERVER_PASSWORD", "password"), "database": os.getenv("SQLSERVER_DATABASE", "master") } ``` ## 🔧 技术实现 ### 1. 连接驱动 - **驱动**: `pymssql` (已在 requirements.txt 中配置) - **连接URL格式**: `mssql+pymssql://username:password@host:port/database` - **SQLAlchemy引擎**: 支持连接池和自动重连 - **URL编码**: 自动处理用户名和密码中的特殊字符(如@、#、&等) ### 2. 连接管理 (database_manager.py) ```python def _build_connection_url(self, db_type, host, port, username, password, database=None, **kwargs): # URL编码处理特殊字符 encoded_username = quote_plus(username) encoded_password = quote_plus(password) if db_type == "sqlserver": db_part = f"/{database}" if database else "" return f"mssql+pymssql://{encoded_username}:{encoded_password}@{host}:{port}{db_part}" ``` ### 3. 特殊字符处理 **问题**: 密码中包含特殊字符(如`@`符号)会导致URL解析错误 **解决方案**: 使用`urllib.parse.quote_plus()`对用户名和密码进行URL编码 **示例**: - 原始密码: `sqlserver@7740` - 编码后: `sqlserver%407740` - 避免了URL解析时将`@`误认为用户名密码分隔符 ## 📊 示例数据初始化 ### 1. 数据表结构 #### customers 表 ```sql CREATE TABLE customers ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(100) NOT NULL, email NVARCHAR(100), phone NVARCHAR(20), created_at DATETIME DEFAULT GETDATE() ) ``` #### orders 表 ```sql CREATE TABLE orders ( id INT IDENTITY(1,1) PRIMARY KEY, customer_id INT, product_name NVARCHAR(100) NOT NULL, quantity INT DEFAULT 1, price DECIMAL(10,2), order_date DATETIME DEFAULT GETDATE(), FOREIGN KEY (customer_id) REFERENCES customers(id) ) ``` ### 2. 示例数据 #### customers 数据 - 张三 (zhang.san@email.com, 13800138001) - 李四 (li.si@email.com, 13800138002) - 王五 (wang.wu@email.com, 13800138003) #### orders 数据 - 笔记本电脑 (客户1, 数量1, 价格5999.99) - 无线鼠标 (客户2, 数量2, 价格199.99) - 机械键盘 (客户3, 数量1, 价格899.99) ### 3. 初始化方法 (sample_data.py) ```python def init_sqlserver_sample_data(self): """初始化SQL Server示例数据""" try: config = DatabaseConfig.get_config("sqlserver") # 创建连接 connection_id = self.db_manager.create_connection( db_type="sqlserver", **config ) # 创建表和插入数据 # ... 详细实现见源码 return True except Exception as e: logger.error(f"SQL Server示例数据初始化失败: {str(e)}") return False ``` ## 🚀 使用方法 ### 1. 自动初始化 启动API服务时自动初始化: ```bash python main.py ``` ### 2. 手动测试连接 使用测试脚本: ```bash # URL编码测试 python test_url_encoding.py # 完整连接测试 python test_sqlserver_connection.py ``` ### 3. API调用 ```bash # 获取连接列表 curl http://localhost:8000/connections # 执行查询 curl -X POST http://localhost:8000/query \ -H "Content-Type: application/json" \ -d '{"connection_id":"sqlserver_xxx", "query":"SELECT * FROM customers"}' ``` ## 🔍 SQL Server 特性 ### 1. 数据类型支持 - **字符串**: NVARCHAR (支持Unicode) - **数字**: INT, DECIMAL, FLOAT - **日期**: DATETIME, DATE, TIME - **自增**: IDENTITY(1,1) ### 2. 连接特性 - **端口**: 默认1433 - **认证**: SQL Server认证和Windows认证 - **数据库**: 支持多数据库实例 - **编码**: UTF-8支持 ## ⚠️ 注意事项 ### 1. 密码特殊字符 - 密码中包含`@`、`#`、`&`等特殊字符时会自动进行URL编码 - 无需手动处理,系统会自动转换 ### 2. 连接配置 - 确保SQL Server服务已启动 - 检查防火墙设置允许1433端口 - 验证用户名密码正确性 - 确认目标数据库存在 ### 3. 权限要求 - 用户需要有CREATE TABLE权限 - 需要有INSERT、SELECT权限 - 建议使用具有足够权限的数据库用户 ## 🛠️ 故障排除 ### 1. 连接失败 **错误**: `Unable to connect: Adaptive Server is unavailable or does not exist` **可能原因**: - SQL Server服务未启动 - 网络连接问题 - 防火墙阻止连接 - 主机地址或端口错误 **解决方案**: 1. 检查SQL Server服务状态 2. 验证网络连接 3. 检查防火墙设置 4. 确认配置信息正确 ### 2. 认证失败 **错误**: `Login failed for user` **解决方案**: 1. 检查用户名密码 2. 确认SQL Server认证模式 3. 验证用户权限 ### 3. 数据库不存在 **错误**: `Cannot open database` **解决方案**: 1. 创建目标数据库 2. 检查数据库名称拼写 3. 验证用户访问权限 ## 📁 相关文件 - `config.py` - 数据库配置定义 - `database_manager.py` - 连接管理和URL构建 - `sample_data.py` - 示例数据初始化 - `test_sqlserver_connection.py` - 连接测试脚本 - `test_url_encoding.py` - URL编码测试脚本 - `.env` - 环境变量配置 - `requirements.txt` - 依赖包配置 ## 📈 总结 SQL Server已成功集成到数据库ETL系统中,支持: ✅ **完整的连接管理** - 包含连接池和自动重连 ✅ **示例数据初始化** - 自动创建表和插入测试数据 ✅ **特殊字符处理** - 自动URL编码密码中的特殊字符 ✅ **错误处理和日志** - 详细的错误信息和调试日志 ✅ **测试工具** - 多个测试脚本验证功能 ✅ **API接口** - RESTful API支持查询和管理 系统现在可以稳定地处理包含特殊字符的SQL Server密码,并提供完整的数据库操作功能。