当前位置: 首页 > news >正文

gorm自定义类型

package dbjson import ( "database/sql/driver" "encoding/json" "errors" "fmt" ) // JSONArray 自定义类型:存 []map[string]interface{} 到 text/jsonb 字段 type JSONArray []map[string]interface{} // 存入数据库:slice → JSON 字符串 func (a JSONArray) Value() (driver.Value, error) { if a == nil { return nil, nil } return json.Marshal(a) } // 从数据库读取:JSON 字符串 → slice func (a *JSONArray) Scan(value interface{}) error { if value == nil { *a = nil return nil } switch v := value.(type) { case []byte: return json.Unmarshal(v, a) case string: return json.Unmarshal([]byte(v), a) default: return errors.New(fmt.Sprintf("无法将 %T 扫描到 JSONArray", value)) } }
package dbjson import ( "database/sql/driver" "encoding/json" "errors" "fmt" ) type JSONArrayStr []string // 存入数据库:slice → JSON 字符串 func (a JSONArrayStr) Value() (driver.Value, error) { if a == nil { return nil, nil } return json.Marshal(a) } // 从数据库读取:JSON 字符串 → slice func (a *JSONArrayStr) Scan(value interface{}) error { if value == nil { *a = nil return nil } switch v := value.(type) { case []byte: return json.Unmarshal(v, a) case string: return json.Unmarshal([]byte(v), a) default: return errors.New(fmt.Sprintf("无法将 %T 扫描到 JSONArray", value)) } }
type WordIndex struct { // 当前组模式mode1-6 CurrentMode string `json:"currentMode" gorm:"column:current_mode;type:character varying(10)"` // 当前轮次1,2,3 CurrentRound int32 `json:"currentRound" gorm:"column:current_round;type:integer"` // 当前单词索引1,2,3 WordIndex int32 `json:"wordIndex" gorm:"column:word_index;type:integer"` // 10 20 30 31-36 NewBulge int `json:"newBulge"` // groupType = word 0 时,当前页码 fsrs PageCurrent int `json:"pageCurrent" gorm:"column:page_current;type:int"` //复习上次训练单词 Filters dbjson.JSONArrayInt64 `json:"filters" gorm:"column:filters;type:text"` //训练上次的筛查单词,与modes配套 ,>0 words 为单词列表, =0 fsrs 单词列表 LastWords dbjson.JSONArrayInt64 `json:"lastWords" gorm:"column:last_words;type:text"` // 所有训练的单词列表 AllWords dbjson.JSONArrayInt64 `json:"allWords" gorm:"column:all_words;type:text"` //本组训练单词,与modes配套 ,>0 words 为单词列表, =0 fsrs 单词列表 Words dbjson.JSONArrayInt64 `json:"words" gorm:"column:words;type:text"` //为下一组准备的数据 NextWords dbjson.JSONArrayInt64 `json:"nextWords" gorm:"column:next_words;type:text"` }

这篇文章摘要介绍了一个处理数据库JSON数据的Go语言实现方案。主要包含两个自定义类型:JSONArray(处理[]map[string]interface{}类型)和JSONArrayStr(处理字符串切片),它们实现了driver.Valuer和sql.Scanner接口,用于JSON数据与数据库之间的序列化和反序列化。此外还定义了一个WordIndex结构体,展示了这些自定义类型在ORM中的实际应用场景,包括存储单词训练相关的各种索引数据(如当前模式、轮次、单词列表等)。

http://www.cnnetsun.cn/news/2731782.html

相关文章:

  • 如何快速批量下载音乐同步歌词:面向音乐爱好者的完整指南
  • 如何快速掌握Python工业相机控制:PyPYLON新手完整教程
  • 流放之路2角色构建模拟器:从数据新手到理论大师的进化之路
  • 2026代理池动态调度机制适配指纹浏览器集群的搭建方案与故障全解
  • 9大网盘直链下载助手:告别限速,实现高速下载自由
  • 基于Arduino与LSM303的简易伺服罗盘:从传感器到执行器的嵌入式实践
  • 5步掌握SUSFS4KSU:内核级Root隐藏的终极实战方案
  • XTOOL朗仁发布自研X-ADK框架,重塑诊断标准
  • Betaflight Configurator:3步掌握无人机飞行控制配置的完整指南
  • QQ音乐API逆向工程:如何绕过加密机制获取音乐数据?
  • Arduino与HMC5883L磁力计:从原理到实战打造高精度数字指南针
  • 智能排障助手:让快马ai为你动态生成keil5安装疑难问题解决方案
  • AI签到不是加个模型就完事!揭秘金融/教育/制造三大行业差异化集成框架(含GDPR/等保2.0双合规校验清单)
  • 零成本改造老旧DSC安防主机:用Arduino与路由器实现邮件报警
  • 拼团用户流失率下降51%的关键——不是补贴,是这7个AI微干预节点(含埋点逻辑与归因模型)
  • 华文诗韵独千秋:论中国古典诗歌对西方诗歌的审美优越性
  • 手把手教你用WTGA工具把Windows 10 LTSC装进U盘,打造随身系统(附固态U盘选购建议)
  • CloudBeaver企业级实战:开源数据管理平台的生产环境部署与优化指南
  • 基于555定时器与热敏电阻的火灾报警电路设计与实现
  • 如何免费下载中国大学MOOC视频课程:MoocDownloader使用指南
  • 六月杭州杨梅时节 赴一场西湖温柔漫游
  • AMD锐龙处理器调试终极指南:5步掌握硬件性能调优核心技能
  • 收藏】2026版零基础转行大模型指南|程序员转型高薪AI岗完整学习路线
  • 从CV算法到空间计算:AI工具与AR系统整合的终极分层架构图(ISO/IEC 23053标准对齐版,含6大合规性检查清单)
  • 告别Keil:用免费的Ozone + J-Link调试你的STM32项目(附ELF文件配置指南)
  • 纸电路入门:用导电铜箔胶带制作会发光的创意卡片
  • 抖音批量下载工具:如何高效获取无水印视频和音乐?
  • 基于树莓派与OpenSky API的飞机预警灯:从地理计算到物联网实践
  • 5分钟掌握ExplorerPatcher:高效恢复Windows 11经典任务栏与开始菜单
  • 语音转文字太麻烦?AsrTools三步搞定音频转录难题