如何使用gorm在postgres SQL数据库中存储点

nx7onnlm  于 2023-03-16  发布在  Go
关注(0)|答案(1)|浏览(183)

我尝试在go服务器上使用GORM将Point变量存储到SQL数据库中,我尝试到处查找,但还没有找到令我满意的答案

fsi0uk1n

fsi0uk1n1#

对于标准库的database/sql包不支持的任何类型,或者依赖于database/sql的第三方包(如gorm)不支持的任何类型,您可以实现ValuerScanner接口来添加对该类型的自定义支持。
为了能够正确实现这两个接口,你需要首先找出目标数据库期望什么作为输入,以及它返回什么作为该类型的输出。在PostgreSQL和Point类型的情况下,语法是(x,y)
因此,您可以执行以下操作:
1.声明类型。

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
}

相关问题