網(wǎng)站首頁 編程語言 正文
GORM存取數(shù)組類型數(shù)據(jù)
在
GORM
不支持?jǐn)?shù)組類型變量數(shù)據(jù)的存取,可以通過GROM
的自定義數(shù)據(jù)類型實現(xiàn)。
一、GORM的自定義類型
1. Scanner/Valuer接口
? GORM
的自定義的數(shù)據(jù)類型必須實現(xiàn)Scanner
/Valuer
接口。
(1) Scanner
接口的Scan
方法,是從數(shù)據(jù)庫讀取數(shù)據(jù)到Go變量時需要進(jìn)行的解析處理,與解碼的過程類型。
(2) Valuer
接口的Value
方法,是將Go變量存到數(shù)據(jù)庫時進(jìn)行編碼處理。
2. 數(shù)組變量
? 雖然GORM
不支持?jǐn)?shù)組變量,但是可以通過實現(xiàn)Scanner
/Valuer
接口,在數(shù)據(jù)庫取/存時進(jìn)行類似解碼/編碼的處理,使數(shù)組變量成為數(shù)據(jù)庫可支持的變量類型。
(1) 實現(xiàn)Sacnner
接口
Scan
函數(shù),從數(shù)據(jù)庫讀取數(shù)據(jù)后,對其進(jìn)行處理,然后獲得Go類型的變量。
type Strs []string func (m *Strs) Scan(val interface{}) error { s := val.([]uint8) ss := strings.Split(string(s), "|") *m = ss return nil }
如上自定義Strs
類型,底層類型未字符串?dāng)?shù)組。Scan
函數(shù)將讀取的val
值,按照字符串處理,以"|"為分隔符進(jìn)行切割,獲得字符串?dāng)?shù)組類型,然后使用指針賦值。
(2) 實現(xiàn)Valuer接口
Value
函數(shù),將數(shù)據(jù)存到數(shù)據(jù)庫時,對數(shù)據(jù)進(jìn)行處理,獲得數(shù)據(jù)庫支持的類型。
func (m Strs) Value() (driver.Value, error) { str := strings.Join(m, "|") return str, nil }
如上將Strs
存入數(shù)據(jù)庫前,將數(shù)組內(nèi)的字符串用"|"拼接,獲得數(shù)據(jù)庫支持的string
類型后再存入數(shù)據(jù)庫。
3. 測試
定義如下函數(shù)進(jìn)行測試
(1) 模型變量
type User struct { ID uint `gorm:"primary_key"` Name string Pics Strs `gorm:"type:longtext"` // 自定義的數(shù)組類型,在數(shù)據(jù)庫中存為長文本類型 }
? (2) Service函數(shù)
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函數(shù)
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) 運(yùn)行結(jié)果
2022/07/30 18:18:41 保存成功!
2022/07/30 18:18:41 獲取成功! {3 Jason [123124 gtsrbxrzsfcv]}
在數(shù)據(jù)庫存儲中體現(xiàn)為:
mysql> select *from users; +----+-------+---------------------+ | id | name | pics | +----+-------+---------------------+ | 3 | Jason | 123124|gtsrbxrzsfcv | +----+-------+---------------------+ 1 row in set (0.00 sec)
二、實際生產(chǎn)
上面的例子中展示了Scanner
/Valuer
接口的簡單使用,實際生產(chǎn)中將數(shù)組類型轉(zhuǎn)換為json
字符串進(jìn)行保存,下面展示一個完整的例子,以一個User
擁有一張包含信息的銀行卡為例(當(dāng)然可以通過一對一關(guān)聯(lián)4444實現(xiàn))。
(1) 實現(xiàn)自定義類型
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) 數(shù)據(jù)表模型
type User struct { ID uint `gorm:"primary_key"` Name string Cards Card `gorm:"json"` // 指定為json類型 }
?總結(jié)
原文鏈接:https://blog.csdn.net/js010111/article/details/126076320
相關(guān)推薦
- 2022-10-20 Android?Flutter實現(xiàn)自定義下拉刷新組件_Android
- 2022-04-23 C++的原生數(shù)組你了解多少_C 語言
- 2023-03-01 shell?sleep睡眠命令的具體使用_linux shell
- 2022-07-01 react-router-dom?V6的配置使用實踐_React
- 2022-05-19 關(guān)于python中不同函數(shù)讀取圖片格式的區(qū)別淺析_python
- 2023-01-03 C語言中的putchar函數(shù)示例_C 語言
- 2022-09-07 在VScode中配置ROS環(huán)境的詳細(xì)過程_相關(guān)技巧
- 2022-04-23 使用Docker?Compose搭建部署ElasticSearch的配置過程_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支