Files
meijiaka-zy/python-api/app/db/session.py
T

62 lines
1.3 KiB
Python

"""
SQLAlchemy 数据库配置
====================
统一使用 PostgreSQL + 异步模式。
"""
from sqlalchemy.ext.asyncio import (
AsyncSession,
async_sessionmaker,
create_async_engine,
)
from sqlalchemy.orm import declarative_base
from app.config import get_settings
Base = declarative_base()
settings = get_settings()
async_engine = create_async_engine(
settings.DATABASE_URL,
pool_size=settings.DATABASE_POOL_SIZE,
max_overflow=settings.DATABASE_MAX_OVERFLOW,
pool_pre_ping=True,
echo=settings.DEBUG,
)
AsyncSessionLocal = async_sessionmaker(
async_engine,
class_=AsyncSession,
expire_on_commit=False,
autocommit=False,
autoflush=False,
)
async def get_db():
"""获取异步数据库 Session
注意:commit 由调用方(API层或Service层)控制,不在此自动提交
"""
async with AsyncSessionLocal() as session:
try:
yield session
except Exception:
await session.rollback()
raise
finally:
await session.close()
async def init_db():
"""初始化数据库"""
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async def close_db():
"""关闭数据库连接"""
await async_engine.dispose()