如果我有这样的类型,如何使用GORM存储嵌入式结构
type A struct {
point GeoPoint
}
type GeoPoint struct {
Lat float64
Lon float64
}
GORM尝试将其添加到新表中,但我想将其添加为另一个字段。
如何做到这一点?
发布于 2019-02-19 12:00:28
您可以尝试:
type A struct {
point GeoPoint `gorm:"embedded"`
}
发布于 2019-12-10 12:49:02
对于任何正在寻找将struct放入GORM模型中并使其自动编组和解组的人来说。
这个解决方案是基于chris的答案的,而且它是有效的!
例如,我想把孩子的数组放在Parent内部作为编组的JSON:
type Child struct {
Lat float64
Lng float64
}
type ChildArray []Children
func (sla *ChildArray) Scan(src interface{}) error {
return json.Unmarshal(src.([]byte), &sla)
}
func (sla ChildArray) Value() (driver.Value, error) {
val, err := json.Marshal(sla)
return string(val), err
}
type Parent struct {
*gorm.Model
Childrens ChildArray `gorm:"column:childrens;type:longtext"`
}
发布于 2018-06-24 14:17:30
我不熟悉Gorm,但使用postgres 时,您需要实现sql.Scanner和sql.Valuer接口,以便将数据转换为postgres类型。下面的代码没有检查错误,因此需要进行一些调整。
https://play.golang.org/p/2-Y-wSeAWnj
package main
import (
"database/sql/driver"
"fmt"
"strconv"
"strings"
)
type GeoPoint struct {
Lat float64
Lon float64
}
func (gp GeoPoint) Value() (driver.Value, error) {
return fmt.Sprintf("(%d,%d)", gp.Lat, gp.Lon), nil
}
func (gp GeoPoint) Scan(src interface{}) error {
raw := src.(string)
coords := raw[1 : len(raw)-1]
vals := strings.Split(coords, ",")
gp.Lat, _ = strconv.ParseFloat(vals[0], 64)
gp.Lon, _ = strconv.ParseFloat(vals[1], 64)
return nil
}
func main() {
gp := GeoPoint{Lat: 112, Lon: 53}
d, _ := gp.Value()
fmt.Printf("%+v\n", d)
gp.Scan("(53, -110)")
fmt.Printf("%+v\n", gp)
}
https://stackoverflow.com/questions/28503001
复制相似问题