[英]How to store a point in postgres SQL database using gorm
我正在尝试在 Go 服务器上使用 GORM 在 SQL 数据库中存储 Point 变量,我尝试到处寻找,但还没有看到让我满意的答案
对于不是由标准库的支持的任何类型database/sql
包,也不是由第三方软件包依赖于database/sql
,像gorm
做,你可以实现Valuer
和Scanner
接口,增加了对类型的自定义支持。
为了能够正确实现这两个接口,您需要首先找出目标数据库期望作为输入的内容以及该类型返回的输出内容。 在 PostgreSQL 和 Point 类型的情况下,语法是(x,y)
。
所以你可以做的是:
type Point struct {
X, Y float64
}
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
}
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.