"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo insertar y seleccionar tipos de geometría posterior a Gorm?

¿Cómo puedo insertar y seleccionar tipos de geometría posterior a Gorm?

Publicado el 2025-03-23
Navegar:631

How can I insert and select PostGIS geometry types with Gorm?

insertando y seleccionando la geometría de posgis con gorm

usando orb y el escaneo de valor personalizado y mariscal

insertando y recuperando los tipos de geometría postgis con GUMM puede ser desafiante. Para abordar este problema, los usuarios pueden aprovechar la biblioteca ORB e implementar métodos de escaneo personalizado () y value () para convertir entre los tipos de GO y el formato binario conocido (WKB) esperado por Gorm. Aquí hay un ejemplo:

type EWKBGeomPoint geom.Point

func (g *EWKBGeomPoint) Scan(input interface{}) error {
    gt, err := ewkb.Unmarshal(input.([]byte))
    if err != nil {
        return err
    }
    g = gt.(*EWKBGeomPoint)

    return nil
}

func (g EWKBGeomPoint) Value() (driver.Value, error) {
    b := geom.Point(g)
    bp := &b
    ewkbPt := ewkb.Point{Point: bp.SetSRID(4326)}
    return ewkbPt.Value()
}

implementando estos métodos en una estructura, el escaneo automatizado de Gormia e insertación de funciones puede funcionar sin problemas con los tipos de geometría.

La configuración de la tabla con migración personalizada

para crear la tabla con la columna de geometría necesaria. = db.exec (`Crear tabla si no existe pistas ( ID CLAVE PRIMARIA DE ID Geom Geometry (Point, 4326) No nula ); `) .Error si err! = nil { devolver err } err = gormigrate.new (db, gormigrate.defaultOptions, []*gormigrate.migration { { ID: "init", Error de migrado: func (tx *gorm.db) { regresar tx.createTable ( Tablas ..., ).Error }, }, { ID: "Tracks_except_geom", Error de migrado: func (tx *gorm.db) { return db.automigrate (Track {}). Error }, }, }).Emigrar()

Esta migración garantiza que la columna de geometría se cree antes de que el resto de la estructura de la tabla esté configurado.
err = db.Exec(`CREATE TABLE IF NOT EXISTS tracks (
    id SERIAL PRIMARY KEY,
    geom geometry(POINT, 4326) NOT NULL
);`).Error
if err != nil {
    return err
}

err = gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{
{
    ID: "init",
    Migrate: func(tx *gorm.DB) error {
        return tx.CreateTable(
            Tables...,
        ).Error
    },
},
{
    ID: "tracks_except_geom",
    Migrate: func(tx *gorm.DB) error {
        return db.AutoMigrate(Track{}).Error
    },
},
}).Migrate()

ejemplo de uso

una vez que el escaneo personalizado (), value () y los pasos de migración se implementan, utilizando el tipo de geometría en un modelo de gorma se vuelve directo: gorm.modelo GeometryPoint EWKBGEOPTOINT `Gorm:" Columna: Geom "` }

Con esta configuración, Gorm puede insertar y seleccionar sin esfuerzo tipos de geometría de posgis, lo que permite un uso perfecto de datos geométricos en aplicaciones GO.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3