Skip to content

以下是对 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、自动建表、上下文会话管理、详细日志和异常处理,构建了一个高效、健壮、易用的数据库访问层。其设计充分考虑了实际生产环境下的安全性、可维护性和扩展性,是企业级应用数据库模块的优秀范例。