以下是对 gc-qa-rag-server/ragapp/common/db.py
文件的详细 Markdown 文档说明:
文档:db.py
代码详解
文件概述
本文件实现了基于 SQLAlchemy 的数据库操作模块,主要用于管理和记录搜索历史(SearchHistory)与问答反馈(QAFeedback)数据。通过定义 ORM 模型、数据库会话管理器以及一系列高层 API,极大地简化了数据库的增删查操作,并保证了数据一致性和异常处理的健壮性。该模块是整个系统与数据库交互的核心桥梁。
主要类与函数说明
1. ORM 模型定义
SearchHistory
类
该类对应数据库中的 SearchHistory
表,用于记录用户的搜索历史。字段包括:
id
:主键,自增。query
:搜索内容,文本类型,不能为空。mode
:搜索模式,字符串类型。product
:产品名称,字符串类型。session_id
:会话 ID,字符串类型。session_index
:会话内索引,整数类型。create_time
:记录创建时间,默认为当前时间。
QAFeedback
类
该类对应数据库中的 QAFeedback
表,用于记录用户对问答结果的反馈。字段包括:
id
:主键,自增。question
:问题内容,文本类型,不能为空。answer
:答案内容,文本类型,不能为空。rating
:评分,短整型。comments
:用户评论,文本类型。product
:产品名称,字符串类型。create_time
:记录创建时间,默认为当前时间。
通过 ORM 模型的定义,开发者可以像操作 Python 对象一样操作数据库表,极大提升了开发效率和代码可维护性。
2. 数据库连接与会话管理
Database
类
该类封装了所有与数据库交互的逻辑。其主要职责包括:
- 初始化数据库连接:通过读取配置文件中的连接字符串,创建数据库引擎,并初始化会话工厂(
SessionLocal
)。在初始化时自动创建所有定义的表,确保数据库结构的完整性。 - 会话管理器:通过
get_session
方法实现了基于上下文管理器的会话获取与自动提交/回滚机制。每次数据库操作都在独立的会话中进行,操作完成后自动提交,如遇异常则回滚并记录日志,最后关闭会话,防止资源泄漏。
这种设计保证了数据库操作的原子性和安全性,极大降低了并发和异常情况下的数据一致性风险。
3. 主要数据库操作 API
add_search_history
用于向 SearchHistory
表插入一条新的搜索历史记录。方法内部通过会话管理器自动处理事务,插入成功返回 True
,失败则记录错误日志并返回 False
。这种布尔返回值设计便于上层业务逻辑做进一步处理。
add_qa_feedback
用于向 QAFeedback
表插入一条新的问答反馈记录。实现方式与 add_search_history
类似,保证了接口风格的一致性。
get_search_history_by_date
用于按日期查询所有搜索历史记录。通过 SQLAlchemy 的查询接口,筛选出 create_time
字段以指定日期开头的所有记录,并将结果转换为字典列表返回。这样便于前端或其他模块直接消费查询结果。
4. 全局数据库实例
文件末尾创建了一个全局的 db
实例,方便其他模块直接导入和使用,避免了重复初始化和资源浪费。
实现原理与设计考虑
1. ORM 与自动建表
通过 SQLAlchemy 的 ORM 机制,开发者无需直接编写 SQL 语句即可完成表结构定义和数据操作。Base.metadata.create_all
保证了在应用启动时自动建表,降低了部署和维护成本。
2. 会话与事务管理
所有数据库操作都通过 get_session
上下文管理器进行,确保了每次操作的原子性和异常安全。无论是插入还是查询,均在独立的事务中完成,遇到异常自动回滚,保证了数据的一致性和可靠性。
3. 日志与异常处理
所有数据库操作都配有详细的异常捕获和日志记录。这样不仅便于开发调试,也为生产环境下的问题追踪和定位提供了有力支持。
4. 配置解耦
数据库连接参数通过 app_config
读取,便于在不同环境下灵活切换数据库,无需修改代码。
5. 结构清晰、接口友好
所有对外 API 均有明确的参数和返回值说明,便于上层业务调用和单元测试。数据查询结果直接以字典列表返回,方便与前端或其他服务对接。
应用场景
该模块适用于需要记录和管理用户行为(如搜索历史、问答反馈)的各类应用。通过标准化的接口和健壮的异常处理,可以作为中大型项目的数据库访问层模板,极大提升开发效率和系统稳定性。
代码示例
# 添加一条搜索历史
db.add_search_history(
query="什么是RAG?",
mode="default",
product="知识库",
session_id="abc123",
session_index=1
)
# 添加一条问答反馈
db.add_qa_feedback(
question="什么是RAG?",
answer="RAG是Retrieval-Augmented Generation的缩写。",
rating=5,
comments="答案很详细",
product="知识库"
)
# 查询某天的所有搜索历史
history = db.get_search_history_by_date("2024-05-01")
print(history)
总结
db.py
通过 SQLAlchemy ORM、自动建表、上下文会话管理、详细日志和异常处理,构建了一个高效、健壮、易用的数据库访问层。其设计充分考虑了实际生产环境下的安全性、可维护性和扩展性,是企业级应用数据库模块的优秀范例。