Files
ai-talk-callback/app/database.py
mark.tian 703408c808 接口请求体改用dict处理
保存每次通话信息到库
2025-12-03 21:56:06 +08:00

91 lines
3.0 KiB
Python

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, Index
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 CallbackData(Base):
__tablename__ = "callback_data"
id = Column(Integer, primary_key=True, autoincrement=True)
phone_number = Column(String(20), nullable=False, comment="手机号")
task_id = Column(String(100), nullable=False, comment="任务ID")
status = Column(Integer, nullable=False, comment="状态")
status_description = Column(String(200), nullable=False, comment="状态描述")
raw_data = Column(Text, nullable=False, comment="原始回调数据JSON字符串")
created_at = Column(DateTime, default=datetime.now)
# 为手机号字段添加索引,提高查询性能
__table_args__ = (
Index('idx_phone_number', 'phone_number'),
)
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