PetAgent/backend/utils/database.py
2026-04-12 11:32:37 +08:00

42 lines
1.2 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 sqlalchemy import create_engine
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy.orm import sessionmaker
from config.settings import settings
# 创建异步引擎
# 将数据库URL转换为asyncmy驱动用于异步操作
# 首先尝试pymysql到asyncmy的转换如果失败则尝试mysql到mysql+asyncmy的转换
if 'mysql+pymysql' in settings.DATABASE_URL:
async_db_url = settings.DATABASE_URL.replace('mysql+pymysql', 'mysql+asyncmy')
else:
async_db_url = settings.DATABASE_URL.replace('mysql', 'mysql+asyncmy')
async_engine = create_async_engine(
async_db_url,
echo=settings.DEBUG,
pool_pre_ping=True
)
# 创建会话工厂
AsyncSessionLocal = async_sessionmaker(
bind=async_engine,
class_=AsyncSession,
expire_on_commit=False
)
async def get_db():
"""获取数据库会话的依赖函数"""
async with AsyncSessionLocal() as session:
try:
yield session
await session.commit()
except Exception:
await session.rollback()
raise
finally:
await session.close()