我参考了 irbanana关于支持 PostGIS 的空间数据类型的回答。我正在使用 MySQL 并尝试实现Value()自定义数据类型EWKBGeomPoint。
我的戈姆模型:
import (
"github.com/twpayne/go-geom"
"github.com/twpayne/go-geom/encoding/ewkb"
)
type EWKBGeomPoint geom.Point
type Tag struct {
Name string `json:"name"`
json:"siteID"` // forign key
Loc EWKBGeomPoint `json:"loc"`
}
据我所知,MySQL 支持这样的插入:
INSERT INTO `tag` (`name`,`loc`) VALUES ('tag name',ST_GeomFromText('POINT(10.000000 20.000000)'))
或者
INSERT INTO `tag` (`name`,`loc`) VALUES ('tag name', ST_GeomFromWKB(X'0101000000000000000000F03F000000000000F03F'))
如果我自己做一个Value()来满足database/sql's 的Valuer界面:
func (g EWKBGeomPoint) Value() (driver.Value, error) {
log.Println("EWKBGeomPoint value called")
b := geom.Point(g)
bp := &b
floatArr := bp.Coords()
return fmt.Sprintf("ST_GeomFromText('POINT(%f %f)')", floatArr[0], floatArr[1]), nil
}
包括在内的整个值ST_GeomFromText()在 Gorm 的单引号中引用,因此它不起作用:
INSERT INTO `tag` (`name`,`loc`) VALUES ('tag name','ST_GeomFromText('POINT(10.000000 20.000000)')');
我如何使它工作?
编辑1:
我追踪到 Gorm 代码,最终它得到了 tocallback_create.go的createCallback功能。在里面检查if primaryField == nil它是真的,它进入调用scope.SQLDB().Exec然后我没有进一步追踪。
scope.SQL 是字符串INSERT INTO标记(名称,loc) VALUES (?,?)并scope.SQLVars打印[tag name {{1 2 [10 20] 0}}]. 看起来插值发生在这个调用中。
这是调用database/sql代码吗?
叮当猫咪
慕桂英3389331
相关分类