如何使用 gorm 在 postgresQL 数据库中存储一个点

Posted

技术标签:

【中文标题】如何使用 gorm 在 postgresQL 数据库中存储一个点【英文标题】:How to store a point in postgres SQL database using gorm 【发布时间】:2016-06-17 20:15:25 【问题描述】:

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

【问题讨论】:

什么是点值?一个坐标集,比如type Point struct X, Y int ?还有:为什么?你试过什么?为什么其他解决方案不令人满意?您需要在问题描述中添加更多细节。 在 postgres SQL 中,我可以创建一个包含类型点的列,它应该是 X 和 Y,是的,但它将存储 lat 和 lng,因此它可能不是 int 类型,除非这是唯一的类型可以存储在 postgres sql 中的一个点中。我查看了关于堆栈溢出的类似帖子:***.com/questions/1727137/… 我查看了第二个答案,即使用点命名空间列 基本上我想使用本网站中提到的 GORM 结构来完成第二篇文章中提到的事情:jinzhu.me/gorm/models.html 【参考方案1】:

对于标准库的database/sql 包不支持的任何类型,以及依赖于database/sql 的第三方包(如gorm),您可以实现ValuerScanner 接口以为该类型添加自定义支持。

为了能够正确实现这两个接口,您首先需要找出目标数据库期望作为输入的内容以及作为该类型的输出返回的内容。对于 PostgreSQL 和 Point 类型,语法为 (x,y)

所以你可以做以下事情:

    声明类型。
type Point struct 
    X, Y float64

    实现 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

    实现 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

【讨论】:

以上是关于如何使用 gorm 在 postgresQL 数据库中存储一个点的主要内容,如果未能解决你的问题,请参考以下文章

如何指定数组gorm golang的默认值?

Gorilla Mux 和 GORM 失败

如何连接到 Google Cloud SQL PostgresQL

Go GORM 有很多关系。如何将数据存储到MYSQL DB

如何使用 GORM 测试实例是不是持久化到数据库中?

如何在 GORM 中按排序顺序保存数据