我尝试在go服务器上使用GORM将Point变量存储到SQL数据库中,我尝试到处查找,但还没有找到令我满意的答案
fsi0uk1n1#
对于标准库的database/sql包不支持的任何类型,或者依赖于database/sql的第三方包(如gorm)不支持的任何类型,您可以实现Valuer和Scanner接口来添加对该类型的自定义支持。为了能够正确实现这两个接口,你需要首先找出目标数据库期望什么作为输入,以及它返回什么作为该类型的输出。在PostgreSQL和Point类型的情况下,语法是(x,y)。因此,您可以执行以下操作:1.声明类型。
database/sql
gorm
Valuer
Scanner
(x,y)
type Point struct { X, Y float64 }
1.实现Valuer接口
func (p Point) Value() (driver.Value, error) { out := []byte{'('} out = strconv.AppendFloat(out, p.X, 'f', -1, 64) out = append(out, ',') out = strconv.AppendFloat(out, p.Y, 'f', -1, 64) out = append(out, ')') return out, nil }
1.实现Scanner接口。
func (p *Point) Scan(src interface{}) (err error) { var data []byte switch src := src.(type) { case []byte: data = src case string: data = []byte(src) case nil: return nil default: return errors.New("(*Point).Scan: unsupported data type") } if len(data) == 0 { return nil } data = data[1 : len(data)-1] // drop the surrounding parentheses for i := 0; i < len(data); i++ { if data[i] == ',' { if p.X, err = strconv.ParseFloat(string(data[:i]), 64); err != nil { return err } if p.Y, err = strconv.ParseFloat(string(data[i+1:]), 64); err != nil { return err } break } } return nil }
1条答案
按热度按时间fsi0uk1n1#
对于标准库的
database/sql
包不支持的任何类型,或者依赖于database/sql
的第三方包(如gorm
)不支持的任何类型,您可以实现Valuer
和Scanner
接口来添加对该类型的自定义支持。为了能够正确实现这两个接口,你需要首先找出目标数据库期望什么作为输入,以及它返回什么作为该类型的输出。在PostgreSQL和Point类型的情况下,语法是
(x,y)
。因此,您可以执行以下操作:
1.声明类型。
1.实现Valuer接口
1.实现Scanner接口。