珊瑚单词新增功能-为单词添加笔记-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 形式开放
  • 做权限控制(只有本人可编辑,管理员可精选)
  • 补单测或最少的接口测试
  • 接前端页面展示"精选笔记"
相关推荐
Zhao-Jichao5 小时前
AI Prompting for Everyone 课程笔记 - P19 数据分析 Data Analysis
人工智能·笔记·数据分析
旖旎夜光5 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
ACP广源盛139246256736 小时前
选型笔记:Type‑C 扩展坞方案评估|DP1.2 转 HDMI2.0 桥接芯片 GSV2201D@ACP
笔记·硬件架构·硬件工程·视频·国产芯片
李长渊哦7 小时前
Qoder 自定义子智能体(Subagent)学习笔记
chrome·笔记·学习
pixelpilot7 小时前
Deta Surf:把笔记、文件和网页塞进同一个 AI 工作台
笔记·其他
蒸蒸yyyyzwd8 小时前
学习笔记 复盘
笔记·八股
旖旎夜光8 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
microrain8 小时前
SagooIoT 的数据接入层只有四张表,却能接住三种外部数据
物联网·golang·数据建模·sagooiot
淡海水9 小时前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
fly-iot9 小时前
【FDE知识库】(4):企业知识库怎么选型,开源知识库分享几个,选择开源协议友好的版本,开发wiki-go项目
golang·开源·开源协议