Я сослался на ответ irbanana о поддержке типа пространственных данных для PostGIS. Я использую MySQL и пытаюсь реализовать Value()
для пользовательского типа данных EWKBGeomPoint
.
Моя модель Gorm:
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
'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:
Я прослеживаю код Горм, в конце концов он получает функцию callback_create.go
createCallback
. Внутри него проверьте на if primaryField == nil
, и это правда, он вызывает scope.SQLDB().Exec
, тогда я не смог отследить дальше.
scope. SQL является строкой INSERT INTO
tag (
name ,
lo c) VALUES (?,?)
и scope.SQLVars
print [tag name {{1 2 [10 20] 0}}]
. Похоже, что внутри этого вызова происходит интерполяция.
Это вызов в database/sql
код?
РЕДАКТИРОВАТЬ 2:
Найден похожий вопрос Stackoverflow здесь . Но я не понимаю решение.