我正在使用gorm与postgres。
我有一个这样的模型
type Friend struct {
Hash string `json:"hash"`
Identifier string `json:"identifier"`
}
type FriendsArray []Friend
func (sla *FriendsArray) Scan(src interface{}) error {
return json.Unmarshal([]byte(src.(string)), &sla)
}
func (sla FriendsArray) Value() (driver.Value, error) {
val, err := json.Marshal(sla)
return string(val), err
}
type User struct {
Friends FriendsArray `json:"friends" gorm:"column:friends;type:text"`
}
如何在Friends列中添加一个新的Friend结构?
var user = User{
Friends: []Friend{{
Hash: "1",
Identifier: "1",
}, {
Hash: "2",
Identifier: "2",
}},
}
db.Create(&user)
var u1 User
err = db.Find(&u1).Error
if err != nil {
panic(err)
}
fmt.Printf("%#vn", u1)
db.Model(&User{}).Where("id = ?", u1.ID).UpdateColumn("friends", append(u1.Friends, Friend{
Hash: "3",
Identifier: "3",
}))
var u User
err = db.Find(&u).Error
if err != nil {
panic(err)
}
fmt.Printf("%#vn", u)
调试输出:
============================================================
[0.034ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="users"
============================================================
[0.161ms] [rows:0] CREATE TABLE `users` (`id` integer,`friends` text,PRIMARY KEY (`id`))
============================================================
[0.268ms] [rows:1] INSERT INTO `users` (`friends`) VALUES ("[{"hash":"1","identifier":"1"},{"hash":"2","identifier":"2"}]") RETURNING `id`
============================================================
[0.128ms] [rows:1] SELECT * FROM `users`
main.User{ID:0x1, Friends:main.FriendsArray{main.Friend{Hash:"1", Identifier:"1"}, main.Friend{Hash:"2", Identifier:"2"}}}
============================================================
[0.160ms] [rows:1] UPDATE `users` SET `friends`="[{"hash":"1","identifier":"1"},{"hash":"2","identifier":"2"},{"hash":"3","identifier":"3"}]" WHERE id = 1
============================================================
[0.105ms] [rows:1] SELECT * FROM `users`
main.User{ID:0x1, Friends:main.FriendsArray{main.Friend{Hash:"1", Identifier:"1"}, main.Friend{Hash:"2", Identifier:"2"}, main.Friend{Hash:"3", Identifier:"3"}}}