Files

52 lines
1.7 KiB
Python
Raw Permalink 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.
# database.py
# 本文件负责配置数据库连接、创建引擎、会话工厂,并提供依赖注入函数。
#
# 相比原版的三点改动:
# 1. 连接串不再硬编码 root/123456,改为读 settings(环境变量 / .env);
# 2. 引擎补上 pool_pre_ping / pool_recycle —— 解决 MySQL "server has gone away";
# 3. expire_on_commit=False —— 避免 commit 后返回 ORM 对象时又触发隐藏查询。
import logging
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.decl_api import declarative_base
from settings import settings
logger = logging.getLogger(__name__)
# 1. 数据库引擎
engine = create_engine(
settings.database_url,
echo=settings.DB_ECHO, # 打开后会把每条 SQL 打到日志,排查问题用
pool_size=settings.DB_POOL_SIZE, # 连接池常驻连接数
max_overflow=settings.DB_MAX_OVERFLOW,
pool_recycle=settings.DB_POOL_RECYCLE, # 超过 N 秒的连接主动回收,避免被 MySQL 断开
pool_pre_ping=True, # 取连接前先 ping 一次,自动剔除死连接
future=True,
)
# 2. 会话工厂
# autocommit=False:不自动提交,事务边界由 DAO 显式控制
# expire_on_commit=False:commit 后对象不过期,API 层序列化时不会再多打一次 SELECT
SessionLocal = sessionmaker(
autocommit=False,
autoflush=False,
expire_on_commit=False,
bind=engine,
)
# 3. 声明式基类
Base = declarative_base()
# 4. 依赖注入:每个 HTTP 请求一个独立会话,请求结束必定关闭
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()