Files
shaguabijia-app-server/app/db/session.py
T
马润林 1aafc28621 feat: 正式 App 后端登录模块 v0.1.0
引入 JWT 认证、极光一键登录、短信 mock 登录与用户表,并补充技术实施文档与部署配置。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-23 17:37:18 +08:00

57 lines
1.6 KiB
Python

"""SQLAlchemy engine + Session 工厂。
FastAPI 路由通过 `Depends(get_db)` 拿到一个 request-scope 的 Session,
请求结束自动 close。
"""
from __future__ import annotations
import os
from collections.abc import Iterator
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
from app.core.config import settings
def _ensure_sqlite_dir(url: str) -> None:
"""SQLite 文件路径如果在子目录,首启时自动 mkdir,避免 sqlalchemy 报 unable to open。"""
prefix = "sqlite:///"
if not url.startswith(prefix):
return
path = url[len(prefix):]
dirname = os.path.dirname(path)
if dirname:
os.makedirs(dirname, exist_ok=True)
_ensure_sqlite_dir(settings.DATABASE_URL)
# SQLite 跨线程访问要 check_same_thread=False;PG/MySQL 不需要这个参数
_connect_args: dict = {}
if settings.DATABASE_URL.startswith("sqlite"):
_connect_args["check_same_thread"] = False
engine = create_engine(
settings.DATABASE_URL,
connect_args=_connect_args,
# echo 在 dev 下打 SQL,生产关掉
echo=settings.APP_DEBUG and not settings.is_prod,
future=True,
pool_pre_ping=True,
)
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False, expire_on_commit=False)
def get_db() -> Iterator[Session]:
"""FastAPI 依赖。请求开始建 session,请求结束自动 close。
出异常时 SQLAlchemy 默认会标记 transaction 为 invalid,close 时自动 rollback。
"""
db = SessionLocal()
try:
yield db
finally:
db.close()