Go gorm数据库point类型 (自定义类型)

在 Golang Gorm 中使用 Point 类型时,可以通过自定义配置来解决问题。以下是一些步骤和示例代码,可用于在 Gorm 中自定义 Point 类型的配置。

1、创建自定义 Point 类型

可以通过自定义类型来代替 Point 类型。可以创建一个名为 MyPoint 的自定义类型,并在该类型上定义 Scan 和 Value 方法来实现 Point 类型的序列化和反序列化。

type MyPoint struct {
    Lat, Lng float64
}

func (p MyPoint) Value() (driver.Value, error) {
    return fmt.Sprintf("POINT(%v %v)", p.Lat, p.Lng), nil
}

func (p *MyPoint) Scan(value interface{}) error {
    var point string
    switch v := value.(type) {
    case []byte:
        point = string(v)
    case string:
        point = v
    default:
        return fmt.Errorf("failed to scan point: %v", value)
    }
    _, err := fmt.Sscanf(point, "POINT(%f %f)", &p.Lat, &p.Lng)
    return err
}

2、在 Gorm 模型中使用自定义类型

在 Gorm 模型中,可以使用自定义类型 MyPoint 来代替 Point 类型。

type Place struct {
    ID    int
    Name  string
    Point MyPoint `gorm:"type:point"`
}

3、在数据库中创建 Point 类型

在使用 Gorm 时,需要确保数据库支持 Point 类型。在创建表时,需要指定 Point 类型。下面是一个使用 PostgreSQL 数据库的示例:

db.Exec("CREATE EXTENSION IF NOT EXISTS postgis")
db.AutoMigrate(&Place{})

在创建表时,可以使用 Gorm 的 AddIndex 方法创建索引。

db.Model(&Place{}).AddIndex("idx_place_point", "point", "")

使用自定义类型 MyPoint 时,需要在 Gorm 标签中指定类型为 point,如上述代码中所示。

文章来源: 使用ChatGPT生成

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容