Files
exchange_monitor_sync/utils/database_manager.py
lz_db f85f4ef152 1
2025-12-04 15:40:19 +08:00

75 lines
2.6 KiB
Python

from sqlalchemy import create_engine, select, update, insert, delete, and_, or_, text
from sqlalchemy.orm import Session, sessionmaker
from sqlalchemy.exc import SQLAlchemyError
from loguru import logger
from typing import List, Dict, Optional, Any
import json
from config.database import DATABASE_CONFIG, SQLALCHEMY_CONFIG
from models.orm_models import Base, StrategyPosition, StrategyOrder, StrategyKX
class DatabaseManager:
"""数据库管理器"""
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance._initialized = False
return cls._instance
def __init__(self):
if not self._initialized:
self._engine = None
self._session_factory = None
self._initialized = True
self._init_engine()
def _init_engine(self):
"""初始化数据库引擎"""
try:
# 构建数据库URL
db_url = (
f"mysql+pymysql://{DATABASE_CONFIG['user']}:{DATABASE_CONFIG['password']}"
f"@{DATABASE_CONFIG['host']}:{DATABASE_CONFIG['port']}"
f"/{DATABASE_CONFIG['database']}?charset={DATABASE_CONFIG['charset']}"
)
# 创建引擎
self._engine = create_engine(
db_url,
echo=SQLALCHEMY_CONFIG['echo'],
echo_pool=SQLALCHEMY_CONFIG['echo_pool'],
pool_size=DATABASE_CONFIG['pool_size'],
max_overflow=DATABASE_CONFIG['max_overflow'],
pool_recycle=DATABASE_CONFIG['pool_recycle'],
pool_pre_ping=SQLALCHEMY_CONFIG['pool_pre_ping']
)
# 创建会话工厂
self._session_factory = sessionmaker(
bind=self._engine,
expire_on_commit=False
)
# 创建表(如果不存在)
Base.metadata.create_all(self._engine)
# logger.info("SQLAlchemy数据库引擎初始化成功")
except Exception as e:
logger.error(f"数据库引擎初始化失败: {e}")
raise
def get_session(self) -> Session:
"""获取数据库会话"""
if self._session_factory is None:
self._init_engine()
return self._session_factory()
def close(self):
"""关闭数据库连接"""
if self._engine:
self._engine.dispose()
logger.info("数据库连接已关闭")