修复 word_note 更新失败 & 完善笔记功能的完整记录
最近在完善我的单词本项目 coral_word 时,围绕 word_note 模块做了一轮集中调整。最初的目标是"支持用户对单词写笔记并更新",但在实际使用中发现更新逻辑没有生效,于是展开排查并顺带补全了笔记的核心闭环能力(新增、更新、读取、精选、追加等)。下面是完整记录。
背景:word_note 应该如何工作
设计目标是:
- 用户可以对某个单词写笔记
- 之后可以更新/追加
- 还能标记"精选笔记",并从其他用户中抽取精选内容用于展示
这意味着数据库层必须保证:
- 同一个用户 + 单词能唯一定位一条笔记
- 更新时能准确命中对应记录
问题:更新无效但不报错
我最初调用了 UpdateWordNote,SQL 执行成功但更新 0 行。
从代码上看,UPDATE 使用条件:
WHERE word_id = ? AND user_id = ?
而插入时却没有写入 user_id,导致 user_id 字段为空,更新条件永远匹配不到。
解决:补写 user_id + 增加更新行数检查
核心修复:
-
创建时补写 user_id
user.goLines 20-33
wordNote := WordNote{
WordID: word_desc.WordID,
UserID: user.Id,
UserName: user.Name,
Note: note,
Selected: false,
}
-
更新时检查 RowsAffected
word_note.goLines 33-57
result, err = tx.Exec("update word_note set note = ? where word_id = ? and user_id = ?", ...)
affected, _ := result.RowsAffected()
if affected == 0 {
return errors.New("no rows updated for word_note")
}
这样一方面修复了更新无法命中的根因,另一方面避免"静默失败"。
功能完善:补齐笔记读写闭环
为了便于后续接入 Web 接口,我顺手补齐了几个核心能力:
1. 获取笔记word_note.goLines 75-80func (wn *WordNote) GetWordNote() error { row := db.QueryRow("select note, selected from word_note where word_id = ? and user_id = ?", wn.WordID, wn.UserID) return row.Scan(&wn.Note, &wn.Selected)}
2. 追加笔记
追加前先读取当前笔记,再拼接:
word_note.goLines 60-67
err := wn.GetWordNote()
wn.Note += "\n" + note
return wn.UpdateWordNote()
3. 标记精选word_note.goLines 82-99func (wn *WordNote) SetSelectedWordNote(selected bool) error { wn.Selected = selected _, err = tx.Exec("update word_note set selected = ? where word_id = ? and user_id = ?", ...)}
4. 获取某单词的精选笔记
通过 word_id 查询全部 selected = true 的记录,并回填用户名:
word_note.goLines 101-129
rows, err := db.Query("select user_id, note from word_note where word_id = ? and selected = true", wordID)
额外清理:让 user 层 API 更完整
为了让业务层更完整,我把 User 上围绕笔记的一组操作补全了:
- CreateWordNote
- UpdateWordNote
- DeleteWordNote
- AppendWordNote
- GetWordNote
- SetSelectedWordNote
- GetSelectedWordNotes
这样后续迁移到 Gin 时,每个接口都能直接调用对应业务方法。
结果
- 更新失败问题彻底修复
- 笔记模块具备完整 CRUD + 精选能力
- 后续接口化(Gin)会更顺畅
验证方式(手动)
-
可以在 main 中做简单验证:
-
CreateWordNote("cooperate", "note_1")
-
UpdateWordNote("cooperate", "note_2")
-
GetWordNote("cooperate") 查看结果
-
AppendWordNote("cooperate", "note_3")
-
SetSelectedWordNote("cooperate", true)
-
GetSelectedWordNotes("cooperate") 查看精选列表
下一步计划
- 接入 Gin,把笔记功能以 REST API 形式开放
- 做权限控制(只有本人可编辑,管理员可精选)
- 补单测或最少的接口测试
- 接前端页面展示"精选笔记"