Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用单个表绑定数组/结构中的多列_Json_Sqlite_Orm_Go - Fatal编程技术网

Json 使用单个表绑定数组/结构中的多列

Json 使用单个表绑定数组/结构中的多列,json,sqlite,orm,go,Json,Sqlite,Orm,Go,我想使用orm。我看了一下,找到了一些带文档的电影。我面临的问题是,这些ORM似乎都无法将多个列绑定到一个数组或子结构中 为了清楚起见,这里有一个例子。我有一张这样的桌子: Table User ---------- UserId UserName UserPositionX UserPositionY UserPositionZ 理想情况下,我希望将字段绑定到此结构中(该数组与我正在使用的另一个客户端API保持一致): 其中UserPositionX绑定到Position[0],UserPo

我想使用orm。我看了一下,找到了一些带文档的电影。我面临的问题是,这些ORM似乎都无法将多个列绑定到一个数组或子结构中

为了清楚起见,这里有一个例子。我有一张这样的桌子:

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]}
所以我的问题是:是否有一个适用于go(和sqlite)的orm能够绑定数组或结构中的多个列,而无需创建另一个表?如果不能使用数组,有没有办法自定义如何将特定类型编组为json


编辑 我找到了一种方法来改变特定类型转换为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
    }