我一直在尝试寻找一种使用 Golang 插入和检索几何类型的方法,特别是库gorm。我还尝试使用为几何定义不同类型并提供不同格式之间的编码/解码的库orb 。
Orb已经为每种类型Scan()
实现Value()
了方法。这允许 goInsert()
和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 是一个 orb.Point):
db.Exec("INSERT INTO orbtest (id, name, geom) VALUES ($1, $2, ST_GeomFromWKB($3))", 1, "Test", wkb.Value(p))
这是我的问题:通过使用 GORM,我无法使用这些函数构建那些查询。GORM 会自动将值插入给定结构的数据库,并将数据扫描到结构的整个层次结构中。这些Scan()
和Value()
方法是在幕后调用的,不受我的控制。
尝试将二进制数据直接插入几何列是行不通的,直接查询几何列将给出十六进制的结果。
我尝试了多种数据库方法来解决这个问题。我试图创建自动调用几何列上所需函数的视图。这适用于查询,但不适用于插入。
是否可以制作某种触发器或规则来自动调用传入/传出数据所需的函数?
我还应该注意,我正在使用的库完全独立于数据和模式工作,因此我没有硬编码任何查询的奢侈。我当然可以编写一个函数来扫描整个数据模型,并从头开始生成查询,但如果有更好的选择,我会更喜欢。
有谁知道在 SQL 中进行这项工作的方法吗?能够通过查询列本身自动调用列上的函数吗?
任何建议将不胜感激。
元芳怎么了
慕尼黑8549860
拉莫斯之舞
神不在的星期二
相关分类