121 lines
4.2 KiB
Markdown
121 lines
4.2 KiB
Markdown
# 修复总结:搜索功能和数据库兼容性
|
||
|
||
## 问题根源
|
||
|
||
后端 API 报错:`psycopg.errors.UndefinedColumn: column je.revision_count does not exist`
|
||
|
||
原因:
|
||
|
||
1. 前端 `journal-entry.html` 中搜索函数缺少函数声明和完整的错误处理
|
||
2. 数据库架构更新(添加版本追踪字段),但新字段还未在数据库中创建
|
||
3. 后端 API 查询引用了不存在的字段
|
||
|
||
## 完成的修复
|
||
|
||
### 1. 前端修复 ✅
|
||
|
||
**文件**: `frontend/journal-entry.html`
|
||
|
||
修复内容:
|
||
|
||
- **printSearchResults()** (第1160-1353行): 添加完整 try-catch 错误处理
|
||
- 添加 API 状态检查 (`if (!res.ok)`)
|
||
- 添加数据格式验证
|
||
- 改为使用 `e.revision_count` 而非 `e.version`
|
||
- 添加用户友好的红色错误提示框
|
||
- **searchJournals()** (第1357-1572行): 添加函数声明和完整错误处理
|
||
- 修复:函数声明从 `async function searchJournals() {` 错误地被删除
|
||
- 恢复完整的 try-catch 结构
|
||
- 所有搜索相关的字段引用都已更新为 `e.revision_count`
|
||
|
||
### 2. 后端修复 ✅
|
||
|
||
**文件**: `backend/app/routers/journal_entries.py`
|
||
|
||
修复内容:
|
||
|
||
- 修改 `get_journal_entries()` 函数使其能够处理两种情况:
|
||
- **新字段存在时**:使用完整的 `revision_count`, `is_latest`, `original_entry_id` 字段
|
||
- **新字段不存在时**:降级处理,返回默认值(`revision_count=1`, `is_latest=true`)
|
||
- 动态检查字段是否存在
|
||
- GROUP BY 子句根据字段存在情况动态调整
|
||
- 完全向后兼容
|
||
|
||
### 3. 数据库迁移指南 ✅
|
||
|
||
**文件**: `backend/sql/admin_migration_add_fields.sql`
|
||
|
||
包含:
|
||
|
||
- 添加 `is_latest` 字段
|
||
- 添加 `revision_count` 字段
|
||
- 添加 `original_entry_id` 字段
|
||
- 添加外键约束
|
||
- 创建优化索引
|
||
- 验证脚本
|
||
|
||
**使用方式**: 数据库管理员需以 postgres 超级用户身份执行此脚本
|
||
|
||
### 4. 迁移文档 ✅
|
||
|
||
**文件**: `backend/DATABASE_MIGRATION_GUIDE.md`
|
||
|
||
提供:
|
||
|
||
- 问题描述
|
||
- 迁移步骤(Docker 和 pgAdmin 两种方式)
|
||
- 验证查询
|
||
- 临时解决方案说明
|
||
- 数据库连接信息
|
||
|
||
## 当前状态
|
||
|
||
系统现在可以:
|
||
|
||
- ✅ 前端搜索正常显示(已修复函数声明问题)
|
||
- ✅ API 自动适应数据库字段
|
||
- ✅ 在迁移完成前继续工作(使用默认值)
|
||
- ✅ 迁移完成后自动启用版本追踪功能
|
||
|
||
## 需要的后续操作
|
||
|
||
**由数据库管理员执行**:
|
||
|
||
1. 使用 postgres 用户连接数据库
|
||
2. 执行 `admin_migration_add_fields.sql` 中的 SQL 代码
|
||
3. 验证三个新字段是否成功创建
|
||
|
||
**执行之后**:
|
||
|
||
- 刷新前端(Ctrl+F5)
|
||
- 测试搜索功能
|
||
- 版本追踪功能将自动启用
|
||
|
||
## 测试步骤
|
||
|
||
1. 打开 `frontend/journal-entry.html`
|
||
2. 尝试搜索仕訳
|
||
3. 如果仍有错误,在浏览器开发者工具中查看控制台日志(F12)
|
||
4. 检查后端日志查看 API 响应
|
||
|
||
## 文件变更汇总
|
||
|
||
| 文件 | 变更 | 行数 |
|
||
| ------------------------------------------ | ------------------------------------------ | ----------------------------------------- |
|
||
| frontend/journal-entry.html | 修复两个搜索函数 | 1794行 |
|
||
| backend/app/routers/journal_entries.py | 添加字段存在检查和降级处理 | 对 get_journal_entries 函数进行了重大修改 |
|
||
| backend/sql/admin_migration_add_fields.sql | 新建迁移脚本 | 113行 |
|
||
| backend/DATABASE_MIGRATION_GUIDE.md | 新建迁移指南 | 文档 |
|
||
| backend/run_db_migration.py | 新建(用于尝试自动迁移,因权限限制未成功) | 工具脚本 |
|
||
|
||
## 权限说明
|
||
|
||
当前使用的 `njts_app` 用户没有 ALTER TABLE 权限。因此:
|
||
|
||
- ✅ 可以查询数据(SELECT)
|
||
- ✅ 可以插入/更新数据(INSERT/UPDATE)
|
||
- ❌ 无法修改表结构(ALTER TABLE)
|
||
- ❌ 无法创建索引
|
||
|
||
这是正常的安全设计。迁移脚本必须由具有 DDL 权限的用户(如 postgres)执行。
|