from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import DeclarativeBase from sqlalchemy import Column, String, Integer, DateTime, Text, JSON from datetime import datetime from app.config import settings from app.logger import get_logger logger = get_logger("database") class Base(DeclarativeBase): pass class CallbackLog(Base): __tablename__ = "callback_logs" id = Column(Integer, primary_key=True, autoincrement=True) site_id = Column(String(100), nullable=False, comment="站点ID") # 新增siteId字段 remote_address = Column(String(45), nullable=True, comment="客户端IP地址") server_ip = Column(String(45), nullable=True, comment="服务器IP地址") request_url = Column(String(500), nullable=False) request_headers = Column(JSON, nullable=False) request_body = Column(JSON, nullable=False) created_at = Column(DateTime, default=datetime.now) class ExternalApiLog(Base): __tablename__ = "external_api_logs" # 重命名表,更通用 id = Column(Integer, primary_key=True, autoincrement=True) callback_logs_id = Column(Integer, nullable=False) request_url = Column(String(500), nullable=False) request_headers = Column(JSON, nullable=False) request_body = Column(JSON, nullable=False) response_status = Column(Integer) response_headers = Column(JSON) response_body = Column(Text) retry_count = Column(Integer, default=0) # 重试次数 created_at = Column(DateTime, default=datetime.now) # 创建数据库引擎 engine = create_async_engine( settings.database_url, echo=settings.debug, future=True ) # 创建会话工厂 AsyncSessionLocal = async_sessionmaker( engine, class_=AsyncSession, expire_on_commit=False ) async def get_db(): async with AsyncSessionLocal() as session: try: yield session finally: await session.close() async def init_db(): logger.info("📊 初始化数据库表结构...") try: async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) logger.info("✅ 数据库表结构初始化完成") except Exception as e: logger.error(f"❌ 数据库初始化失败: {e}") raise