Files
Tunnel/app/servives/table_manager.py
2025-12-12 10:57:31 +08:00

88 lines
3.0 KiB
Python

"""
动态表管理器
处理分表创建,避免事务冲突
"""
from sqlalchemy import text
from sqlalchemy.orm import Session
from app.core.logging_config import get_logger
from app.models.work_area import WorkArea
from app.models.section_data import SectionData
from app.models.checkpoint import Checkpoint
from app.models.measurement_data import MeasurementData
logger = get_logger(__name__)
class TableManager:
"""动态表管理器"""
# 缓存已创建的表
_created_tables = set()
@classmethod
def ensure_table_exists(cls, db: Session, table_type: str, account_id: int) -> bool:
"""
确保表存在,如果不存在则创建
使用独立连接创建表,避免与业务事务冲突
"""
table_name = cls._get_table_name(table_type, account_id)
cache_key = f"{table_type}_{account_id}"
# 检查缓存
if cache_key in cls._created_tables:
return True
try:
# 检查表是否存在
result = db.execute(text(f"SHOW TABLES LIKE '{table_name}'"))
if result.fetchone():
cls._created_tables.add(cache_key)
return True
# 获取建表SQL
create_sql = cls._get_create_sql(table_type, account_id)
if not create_sql:
logger.error(f"未知的表类型: {table_type}")
return False
# 使用独立连接创建表(避免事务冲突)
connection = db.get_bind().connect()
try:
connection.execute(text(create_sql))
connection.commit()
cls._created_tables.add(cache_key)
logger.info(f"动态创建表成功: {table_name}")
return True
finally:
connection.close()
except Exception as e:
logger.error(f"创建表失败 {table_name}: {e}")
return False
@classmethod
def _get_table_name(cls, table_type: str, account_id: int) -> str:
"""获取表名"""
table_map = {
"work_area": WorkArea.get_table_name,
"section_data": SectionData.get_table_name,
"checkpoint": Checkpoint.get_table_name,
"measurement_data": MeasurementData.get_table_name,
}
return table_map.get(table_type, lambda x: "")(account_id)
@classmethod
def _get_create_sql(cls, table_type: str, account_id: int) -> str:
"""获取建表SQL"""
sql_map = {
"work_area": WorkArea.get_create_sql,
"section_data": SectionData.get_create_sql,
"checkpoint": Checkpoint.get_create_sql,
"measurement_data": MeasurementData.get_create_sql,
}
return sql_map.get(table_type, lambda x: "")(account_id)
@classmethod
def clear_cache(cls):
"""清除表缓存"""
cls._created_tables.clear()