feat: add MySQL database support alongside SQL Server

This commit implements multi-database support, allowing the system to switch
between SQL Server and MySQL databases seamlessly.

## New Features
- Database type selection (SQL Server or MySQL) via configuration
- Automatic table name conversion between formats ([dbo].[table] → dbo_table)
- Automatic parameter placeholder handling (? for SQL Server, %s for MySQL)
- GUI settings tab now includes database type dropdown and MySQL configuration

## Database Abstraction Layer
- db/base_connection.py: Abstract base class for database connections
- db/sqlserver_connection.py: SQL Server implementation
- db/mysql_connection.py: MySQL implementation using mysql-connector-python
- db/connection_factory.py: Factory pattern for creating connections
- db/table_name_converter.py: Table name format conversion utility

## DAO Base Class
- db/base_dao.py: Base DAO with helper methods for SQL conversion and placeholders

## Updated Components
- config/schema.py: Extended with DatabaseType enum and MySQL/SQLServer config classes
- config/defaults.py: Added MySQL default configuration
- config/loader.py: Updated to handle new database structure
- db/connection.py: Refactored to use factory pattern and load user config
- All DAO files: Updated to inherit from BaseDAO with automatic conversion

## Dependencies
- Added mysql-connector-python>=8.0.0 to requirements.txt

## Configuration
To use MySQL, set db_type to "mysql" in config/user_settings.json:
{
  "database": {
    "db_type": "mysql",
    "mysql": {
      "host": "192.168.31.83",
      "port": 3306,
      "database": "BLD_DB",
      "username": "remote_user",
      "password": "3.1415926Beeke"
    }
  }
}

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-02-09 21:50:54 +08:00
parent 04b99292ad
commit caac411e17
17 changed files with 1661 additions and 513 deletions

90
db/connection_factory.py Normal file
View File

@@ -0,0 +1,90 @@
"""
数据库连接工厂
根据配置创建对应数据库类型的连接实例
"""
from typing import Dict, Any, Optional
from config.schema import DatabaseType
from db.base_connection import BaseDatabaseConnection
from db.sqlserver_connection import SQLServerConnection
from db.mysql_connection import MySQLConnection
class ConnectionFactory:
"""数据库连接工厂类"""
@staticmethod
def create_connection(
db_type: DatabaseType,
config: Optional[Dict[str, Any]] = None
) -> BaseDatabaseConnection:
"""
根据数据库类型创建对应的连接实例
Args:
db_type: 数据库类型SQLSERVER 或 MYSQL
config: 数据库配置字典
Returns:
对应数据库的连接实例
Raises:
ValueError: 不支持的数据库类型
"""
if db_type == DatabaseType.SQLSERVER:
return SQLServerConnection(config)
elif db_type == DatabaseType.MYSQL:
return MySQLConnection(config)
else:
raise ValueError(f"不支持的数据库类型: {db_type}")
@staticmethod
def create_from_config(database_config) -> BaseDatabaseConnection:
"""
从 DatabaseConfig 配置对象创建连接
Args:
database_config: DatabaseConfig 配置对象
Returns:
对应数据库的连接实例
Raises:
ValueError: 不支持的数据库类型
"""
db_type = database_config.db_type
if db_type == DatabaseType.SQLSERVER:
# 构建 SQL Server 配置字典
config = {
'server': database_config.server,
'database': database_config.database,
'username': database_config.username,
'password': database_config.password,
}
if database_config.sqlserver:
config['driver'] = database_config.sqlserver.driver
config['trust_server_certificate'] = (
database_config.sqlserver.trust_server_certificate
)
return SQLServerConnection(config)
elif db_type == DatabaseType.MYSQL:
# 构建 MySQL 配置字典
config = {
'database': database_config.database,
'username': database_config.username,
'password': database_config.password,
}
if database_config.mysql:
config['host'] = database_config.mysql.host
config['port'] = database_config.mysql.port
config['charset'] = database_config.mysql.charset
else:
# 回退到 server 字段(兼容旧配置)
config['host'] = database_config.server
return MySQLConnection(config)
else:
raise ValueError(f"不支持的数据库类型: {db_type}")