Files
playwrite/db/connection_factory.py
Misaka caac411e17 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>
2026-02-09 21:50:54 +08:00

91 lines
2.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.
"""
数据库连接工厂
根据配置创建对应数据库类型的连接实例
"""
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}")