【问题标题】:How to store a point in postgres SQL database using gorm如何使用 gorm 在 postgresQL 数据库中存储一个点
【发布时间】: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 中的一个点中。我查看了关于堆栈溢出的类似帖子:stackoverflow.com/questions/1727137/… 我查看了第二个答案,即使用点命名空间列
  • 基本上我想使用本网站中提到的 GORM 结构来完成第二篇文章中提到的事情:jinzhu.me/gorm/models.html

标签: postgresql go go-gorm


【解决方案1】:

对于标准库的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
}

【讨论】:

    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多