我一直在试图找到一种使用Golang插入和检索几何类型的方法,特别是库gorm.我还试图使用库orb,它为几何定义了不同的类型,并提供不同格式之间的编码/解码.
ORB已经为每种类型实现了Scan()
和Value()
个方法.这允许GO的Insert()
和Scan()
函数处理基元以外的类型.但是,ORB期望使用熟知二进制(WKB)格式表示的几何图形.
ORB文档显示,要实现这一点,只需将字段包装在PostGIS函数ST_AsBinary()
和ST_GeomFromWKB()
中,分别用于查询和插入.例如,表格定义为:
_, err = db.Exec(`
CREATE TABLE IF NOT EXISTS orbtest (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
geom geometry(POLYGON, 4326) NOT NULL
);
`)
您只需执行以下操作:
rows, err := db.Query("SELECT id, name, ST_AsBinary(geom) FROM orbtest LIMIT 1")
对于插入(其中p是一个圆点):
db.Exec("INSERT INTO orbtest (id, name, geom) VALUES ($1, $2, ST_GeomFromWKB($3))", 1, "Test", wkb.Value(p))
我的问题是:通过使用GORM,我无法使用这些函数构建这些查询.在给定 struct 的情况下,GORM将自动将值插入到数据库中,并将数据扫描到 struct 的整个层次 struct 中.这Scan()
和Value()
方法是在幕后调用的,不受我的控制.
试图直接将二进制数据插入几何列是行不通的,而直接查询几何列将以十六进制给出结果.
我try 了多种数据库方法来解决这个问题.我try 创建自动调用几何列上所需函数的视图.这适用于查询,但不适用于插入.
是否可以创建某种类型的触发器或规则,自动调用传入/传出数据所需的函数?
我还应该注意到,我正在使用的库完全独立于数据和模式,因此我没有硬编码任何类型查询的特权.我当然可以编写一个函数来扫描整个数据模型,并从头开始生成查询,但我更希望有更好的 Select .
有人知道用SQL实现这一点的方法吗?只需查询列本身,就能自动调用列上的函数吗?
如有任何建议,将不胜感激.