Json 使用单个表绑定数组/结构中的多列
我想使用orm。我看了一下,找到了一些带文档的电影。我面临的问题是,这些ORM似乎都无法将多个列绑定到一个数组或子结构中 为了清楚起见,这里有一个例子。我有一张这样的桌子:Json 使用单个表绑定数组/结构中的多列,json,sqlite,orm,go,Json,Sqlite,Orm,Go,我想使用orm。我看了一下,找到了一些带文档的电影。我面临的问题是,这些ORM似乎都无法将多个列绑定到一个数组或子结构中 为了清楚起见,这里有一个例子。我有一张这样的桌子: Table User ---------- UserId UserName UserPositionX UserPositionY UserPositionZ 理想情况下,我希望将字段绑定到此结构中(该数组与我正在使用的另一个客户端API保持一致): 其中UserPositionX绑定到Position[0],UserPo
Table User
----------
UserId
UserName
UserPositionX
UserPositionY
UserPositionZ
理想情况下,我希望将字段绑定到此结构中(该数组与我正在使用的另一个客户端API保持一致):
其中UserPositionX
绑定到Position[0]
,UserPositionY
绑定到Position[1]
和UserPositionZ
绑定到Position[2]
我愿意使用这样的结构而不是数组:
type Vector3 struct {
X, Y, Z float64
}
type User struct {
Id int64
Name string
Position Vector3
}
但我面临两个问题:
- 我不想在另一个表中分隔
字段。我所看到的所有ORM似乎都认为1结构= 1表。< /LI>位置
- 此结构必须转换(编组)为json。在这个json中,我需要位置是一个数组(例如:
){“id”:42,名称:“Foo”,位置:[6.3,8.6,2.65]}
编辑 我找到了一种方法来改变特定类型转换为json的方式。我只需要向给定类型添加两个方法。在本例中:
func (p *Vector3) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("[%v,%v,%v]", p.X, p.Y, p.Z)), nil
}
func (p *Vector3) UnmarshalJSON(data []byte) (err error) {
_, err = fmt.Sscanf(string(data), "[%v,%v,%v]", &p.X, &p.Y, &p.Z)
return
}
结果:
test, _ := json.Marshal(User{3, "fooBarBaz", Vector3{42.0, 35, 23.45}})
fmt.Println(string(test))
// ==> {"Id":3,"Name":"fooBarBaz","Position":[42.0,35,23.45]}
test2 := User{}
json.Unmarshal([]byte(`{"Id":3,"Name":"fooBarBaz","Position":[42.0,35,23.45]}`), &test2)
log.Println(test2)
// ==> {3 fooBarBaz {42.0 35 23.45}}
我最初的问题仍然存在,因为我测试了列表中的一些ORM,唯一发现的是通过嵌入结构,我需要
Vector3
作为属性。在这种情况下,您需要结合数据库/sql
包和sql数据库的功能:
group\u CONCAT
将您的职位列分组到逗号分隔的列表中sql.Scanner
接口,以将逗号分隔的列表映射到数组type Foo struct {
Bar []string
}
func (f *Foo) Scan(src interface{}) error {
switch t := src.(type) {
// t would then equal "value1, value2, value3"
case string:
*f = strings.Split(t, ",")
return nil
}
return ErrBadScanType
}
其中,将key1:value1,key2:value2,…
映射到对象
PS:如果你的数据库支持的话,你还应该考虑使用一些特殊的代码> GEO数据类型来存储向量。
完全是可以的,回答你自己的问题,如果你不知道的话。“我知道Hippppo,但是我的编辑没有回答这个问题。谢谢你的回答,但这种方式并没有真正优化。@SebastienC。为什么没有优化?type Foo struct {
Bar []string
}
func (f *Foo) Scan(src interface{}) error {
switch t := src.(type) {
// t would then equal "value1, value2, value3"
case string:
*f = strings.Split(t, ",")
return nil
}
return ErrBadScanType
}