项目已从手动 SQL 查询迁移到 SQLAlchemy ORM,解决了连接管理问题。
| 文件 | 说明 |
|---|---|
backend/models_db.py |
SQLAlchemy 模型定义(User, Message, ConversationSummary) |
backend/文档/SQLAlchemy迁移说明.md |
本文档 |
| 文件 | 改动内容 |
|---|---|
backend/requirements.txt |
添加 sqlalchemy[asyncio]==2.0.23 |
backend/database.py |
重构为使用 SQLAlchemy 连接池和 Session |
backend/services/user_service.py |
所有 SQL 查询改为 ORM |
backend/services/message_service.py |
所有 SQL 查询改为 ORM |
backend/services/context_service.py |
所有 SQL 查询改为 ORM |
backend/services/summary_service.py |
所有 SQL 查询改为 ORM |
之前(手动管理):
现在(SQLAlchemy 自动管理):
pool_pre_ping=True:自动健康检查pool_recycle=7200:自动连接回收之前:
query = "SELECT * FROM users WHERE user_id = %(user_id)s"
user = await db_manager.execute_one(query, {"user_id": user_id})
现在:
async with db_manager.get_session() as session:
result = await session.execute(
select(User).where(User.user_id == user_id)
)
user = result.scalar_one_or_none()
cd backend
pip install -r requirements.txt
from database import db_manager
async with db_manager.get_session() as session:
# 使用 session 进行数据库操作
user = await session.get(User, user_id)
# 查询单个对象
user = await session.get(User, user_id)
# 查询列表
result = await session.execute(
select(Message)
.where(Message.user_id == user_id)
.order_by(Message.created_at.desc())
)
messages = result.scalars().all()
# 更新
await session.execute(
update(User)
.where(User.user_id == user_id)
.values(username="new_name")
)
await session.commit()
SQLAlchemy 连接池配置(在 database.py 中):
pool_size=10:连接池大小max_overflow=20:最大溢出连接数pool_pre_ping=True:自动健康检查(关键)pool_recycle=7200:连接回收时间(2小时)async with db_manager.get_session() as session 确保 Session 正确关闭await session.commit()| 指标 | 之前 | 现在 |
|---|---|---|
| 连接管理 | 手动实现 | ✅ 自动管理 |
| 健康检查 | 手动实现 | ✅ 自动检测 |
| 代码维护性 | SQL 分散 | ✅ 模型集中 |
| 类型安全 | 无 | ✅ 有类型提示 |