珊瑚单词新增功能-为单词添加笔记-GoLang

修复 word_note 更新失败 & 完善笔记功能的完整记录

最近在完善我的单词本项目 coral_word 时,围绕 word_note 模块做了一轮集中调整。最初的目标是"支持用户对单词写笔记并更新",但在实际使用中发现更新逻辑没有生效,于是展开排查并顺带补全了笔记的核心闭环能力(新增、更新、读取、精选、追加等)。下面是完整记录。


背景:word_note 应该如何工作

设计目标是:

  • 用户可以对某个单词写笔记
  • 之后可以更新/追加
  • 还能标记"精选笔记",并从其他用户中抽取精选内容用于展示

这意味着数据库层必须保证:

  • 同一个用户 + 单词能唯一定位一条笔记
  • 更新时能准确命中对应记录

问题:更新无效但不报错

我最初调用了 UpdateWordNote,SQL 执行成功但更新 0 行。

从代码上看,UPDATE 使用条件:

WHERE word_id = ? AND user_id = ?

而插入时却没有写入 user_id,导致 user_id 字段为空,更新条件永远匹配不到。


解决:补写 user_id + 增加更新行数检查

核心修复:

  1. 创建时补写 user_id

    user.goLines 20-33

    wordNote := WordNote{

    WordID: word_desc.WordID,

    UserID: user.Id,

    UserName: user.Name,

    Note: note,

    Selected: false,

    }

  1. 更新时检查 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 形式开放
  • 做权限控制(只有本人可编辑,管理员可精选)
  • 补单测或最少的接口测试
  • 接前端页面展示"精选笔记"
相关推荐
Tomhex1 小时前
Go字符串拼接最佳实践
golang·go
zs宝来了2 小时前
Go 内存管理:三色标记 GC 与逃逸分析
golang·go·后端技术
Z.风止2 小时前
Large Model-learning(3)
人工智能·笔记·后端·深度学习
gihigo19983 小时前
嵌入式幼儿园刷卡系统 (C#实现)
c#
qq_454245033 小时前
通用引用管理框架
数据结构·架构·c#
aq55356003 小时前
三大编程语言深度对比:C# vs 易语言 vs 汇编
开发语言·汇编·c#
光泽雨3 小时前
c# 文件编译的过程
开发语言·c#
zxy28472253013 小时前
使用正运动的仿真软件C#
c#·仿真·运动控制·正运动·无硬件
三省持敬4 小时前
异步并发的“流量警察”:在C#中使用SemaphoreSlim进行并发控制的最佳实践
c#
东京老树根4 小时前
SAP学习笔记 - BTP SAP Build02 - Deploy,开始URL,Approve,Reject,履历确认,Log,Context
笔记·学习