73 lines
2.2 KiB
Python
73 lines
2.2 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
|
|
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.utcnow)
|
|
|
|
|
|
class ExternalApiLog(Base):
|
|
__tablename__ = "external_api_logs" # 重命名表,更通用
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
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.utcnow)
|
|
|
|
|
|
# 创建数据库引擎
|
|
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 |