如何使用 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
),您可以实现Valuer
和Scanner
接口以为该类型添加自定义支持。
为了能够正确实现这两个接口,您首先需要找出目标数据库期望作为输入的内容以及作为该类型的输出返回的内容。对于 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 数据库中存储一个点的主要内容,如果未能解决你的问题,请参考以下文章
如何连接到 Google Cloud SQL PostgresQL