網站首頁 編程語言 正文
GORM存取數組類型數據
在
GORM
不支持數組類型變量數據的存取,可以通過GROM
的自定義數據類型實現。
一、GORM的自定義類型
1. Scanner/Valuer接口
? GORM
的自定義的數據類型必須實現Scanner
/Valuer
接口。
(1) Scanner
接口的Scan
方法,是從數據庫讀取數據到Go變量時需要進行的解析處理,與解碼的過程類型。
(2) Valuer
接口的Value
方法,是將Go變量存到數據庫時進行編碼處理。
2. 數組變量
? 雖然GORM
不支持數組變量,但是可以通過實現Scanner
/Valuer
接口,在數據庫取/存時進行類似解碼/編碼的處理,使數組變量成為數據庫可支持的變量類型。
(1) 實現Sacnner
接口
Scan
函數,從數據庫讀取數據后,對其進行處理,然后獲得Go類型的變量。
type Strs []string func (m *Strs) Scan(val interface{}) error { s := val.([]uint8) ss := strings.Split(string(s), "|") *m = ss return nil }
如上自定義Strs
類型,底層類型未字符串數組。Scan
函數將讀取的val
值,按照字符串處理,以"|"為分隔符進行切割,獲得字符串數組類型,然后使用指針賦值。
(2) 實現Valuer接口
Value
函數,將數據存到數據庫時,對數據進行處理,獲得數據庫支持的類型。
func (m Strs) Value() (driver.Value, error) { str := strings.Join(m, "|") return str, nil }
如上將Strs
存入數據庫前,將數組內的字符串用"|"拼接,獲得數據庫支持的string
類型后再存入數據庫。
3. 測試
定義如下函數進行測試
(1) 模型變量
type User struct { ID uint `gorm:"primary_key"` Name string Pics Strs `gorm:"type:longtext"` // 自定義的數組類型,在數據庫中存為長文本類型 }
? (2) Service函數
func SaveUser(user User) error { var err error err = db.Save(&user).Error return err } func GetUser(name string) (User, error) { var user User err := db.First(&user, "name = ?", name).Error return user, err }
? (3) testService函數
func TestSaveUser() { user := User{ Name: "Jason", Pics: Strs{ "123124", "gtsrbxrzsfcv", }, } err := SaveUser(user) if err != nil { log.Panicln("保存失敗!", err) } else { log.Println("保存成功!") } } func TestGetUser() { user, err := GetUser("Jason") if err != nil { log.Panicln("獲取失敗!", err) } else { log.Println("獲取成功!", user) } }
? (4) 運行結果
2022/07/30 18:18:41 保存成功!
2022/07/30 18:18:41 獲取成功! {3 Jason [123124 gtsrbxrzsfcv]}
在數據庫存儲中體現為:
mysql> select *from users; +----+-------+---------------------+ | id | name | pics | +----+-------+---------------------+ | 3 | Jason | 123124|gtsrbxrzsfcv | +----+-------+---------------------+ 1 row in set (0.00 sec)
二、實際生產
上面的例子中展示了Scanner
/Valuer
接口的簡單使用,實際生產中將數組類型轉換為json
字符串進行保存,下面展示一個完整的例子,以一個User
擁有一張包含信息的銀行卡為例(當然可以通過一對一關聯4444實現)。
(1) 實現自定義類型
type User struct { ID uint `gorm:"primary_key"` Name string Cards Card `gorm:"json"` } type Card struct { // 指定json的Tag。 Type int `json:"type"` Account string `json:"account"` Password string `json:"password"` } // Scan 解碼json字符串 func (card *Card) Scan(val interface{}) error { b, _ := val.([]byte) return json.Unmarshal(b, card) } // Value 編碼json func (card Card) Value() (value driver.Value, err error) { return json.Marshal(card) }
? (2) 數據表模型
type User struct { ID uint `gorm:"primary_key"` Name string Cards Card `gorm:"json"` // 指定為json類型 }
?總結
原文鏈接:https://blog.csdn.net/js010111/article/details/126076320
相關推薦
- 2022-05-23 Python?圖形界面框架TkInter之在源碼中找pack方法_python
- 2022-10-08 ASP.NET堆和棧四之對托管和非托管資源的垃圾回收和內存分配_實用技巧
- 2023-02-07 C#實現自定義屏保的示例代碼_C#教程
- 2023-05-20 openGauss數據庫共享存儲特性概述_數據庫其它
- 2022-06-28 使用?Docker?Compose?構建復雜的多容器?App的方法_docker
- 2022-10-05 Python中matplotlib庫安裝失敗的經驗總結(附pycharm配置anaconda)_py
- 2022-12-08 vscode擴展代碼定位實現步驟詳解_相關技巧
- 2022-07-14 C#中的并發集合Concurrent類_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支