Files
lotteryServer/core/db.py
2026-09-03 14:31:25 +08:00

62 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from fastapi import Depends
from typing import Annotated
from sqlmodel import Session, create_engine
from core.config.settings import settings
from sqlalchemy.orm import sessionmaker
# 1.引擎配置
engine = create_engine(
settings.mysql_url, # 数据库连接url
echo=settings.DATABASE_ECHO, # echo=True 打印生成的SQL语句开发调试打开生产关闭
pool_recycle = 3600, # 1小时回收连接解决mysql 8小时断开问题
pool_pre_ping=True, # 连接前检查
pool_size=settings.DATABASE_POOL_SIZE, # 连接池大小
max_overflow=settings.DATABASE_MAX_OVERFLOW, # 最大溢出连接
)
# 2. 创建 sessionmaker工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 3.依赖注入函数
def get_db():
"""FastAPI 依赖注入用"""
db = SessionLocal() # 使用工厂创建 Session
try:
yield db
db.commit() # 无异常则提交
except Exception:
db.rollback() # 异常则回滚
raise
finally:
db.close() # 确保关闭
# 4. 定义依赖类型
SessionDep = Annotated[Session, Depends(get_db)]
# 5. 供定时任务使用的上下文管理器
from contextlib import contextmanager
@contextmanager
def get_db_session():
"""定时任务、脚本用"""
db = SessionLocal()
try:
yield db
db.commit()
except Exception:
db.rollback()
raise
finally:
db.close()
# 使用方式
# def crawl_task():
# data = fetch_lottery_data()
#
# with get_db_session() as db:
# # 检查是否存在
# existing = db.query(LotteryResult).filter_by(draw_no=data['draw_no']).first()
# if not existing:
# record = LotteryResult(**data)
# db.add(record)
# # with 块结束时自动 commit