V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
richzhu
V2EX  ›  Go 编程语言

gorm 如何存数组

  •  
  •   richzhu · 2020-09-11 10:55:13 +08:00 · 7221 次点击
    这是一个创建于 1525 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬,请问如何使用 gorm 保存切片,下面是我出错的代码

    结构体

    type Node struct {
    	ID     int    `json:"id"`
    	Name   string `json:"name"`
    	Author string `json:"author"`
    	IP   []string `json:"ip"`
    }
    

    Gorm 保存

    ips:=[]string{"1.1.1.1","2.2.2.2","3.3.3.3"}
    body := Node{Name: "testName", Author: "testAuthor", Node: ips}
    if err := DB.Create(&body).Error; err != nil {
    	return false
    }
    

    得到报错

    unsupported data type: &[]
    

    我想存入数据库的数据形式是:

    "1.1.1.1","2.2.2.2","3.3.3.3"
    

    前端发来的数据,只能是一个数组包含着 ip,还不能改。。。 这种情况下,问下大佬们我该咋整 T_T

    10 条回复    2020-09-14 08:56:19 +08:00
    zgw0
        1
    zgw0  
       2020-09-11 11:06:25 +08:00   ❤️ 1
    我之前的做法是转了字符串存起来,然后用的时候再转回数组
    z0wjqnxi
        2
    z0wjqnxi  
       2020-09-11 11:17:26 +08:00   ❤️ 1
    ``` golang
    type Node struct {
    ...
    IPList ipList `json:"ip" binding:”gt=0,dive,ipv4“ `
    }

    type ipList []string

    // gorm 自定义结构需要实现 Value Scan 两个方法
    // Value 实现方法
    func (p ipList ) Value() (driver.Value, error) {
    return json.Marshal(p)
    }

    // Scan 实现方法
    func (p *ipList ) Scan(data interface{}) error {
    return json.Unmarshal(data.([]byte), &p)
    }


    自定义结构我是这么实现的
    richzhu
        3
    richzhu  
    OP
       2020-09-11 11:29:08 +08:00
    @zgw0 谢谢老哥,咱俩想的一样,但是我这情况有点特殊,前端发来的数据结构体必须要保持[]string 的类型才可以收到,又不想大改,就没用这个方法

    @z0wjqnxi 感谢大佬,无脑复制您的代码,把 node 改成 ipList 类型后,一下就成功了,爽的不要不要的~
    richzhu
        4
    richzhu  
    OP
       2020-09-11 11:40:39 +08:00
    sql: Scan error on column index 5, name "node": invalid character '.' after top-level value;

    @z0wjqnxi
    大佬好,使用这个方法之后,不知道为什么,不能读了,读取数据的时候,报上面这个错误
    richzhu
        5
    richzhu  
    OP
       2020-09-11 11:45:37 +08:00
    @z0wjqnxi 知道了 哈哈,是表中老数据的问题,打扰大佬了
    Yoock
        6
    Yoock  
       2020-09-11 12:54:02 +08:00 via iPhone
    AfterFind hook
    cszchen
        7
    cszchen  
       2020-09-12 07:51:44 +08:00 via Android
    用 postgres.jsonb 类型
    reus
        8
    reus  
       2020-09-12 14:34:44 +08:00
    要对 ip 做查询做索引时你就知错

    应该另外建表,存成多行
    adrianduan
        9
    adrianduan  
       2020-09-12 21:00:58 +08:00
    不知道你用的是 gorm V1 还是 V2,如果使用的 PostgreSQL 且版本为 V1 的话可以直接定义类型为 pq.StringArray,V2 好像改了 PostgreSQL 的 driver 从 pq 到 pgx,这种写法就不行了
    richzhu
        10
    richzhu  
    OP
       2020-09-14 08:56:19 +08:00
    @reus 大佬好,请问存成多行是什么意思

    是说新建一张表 2 个字段 app ip
    比如一个 app 名字叫 test 有 3 个 ip,另一个 app 名字是 test1,有 2 个 ip,那表中内容就是

    test 1.1.1.1
    test 2.2.2.2
    test 3.3.3.3
    test1 4.4.4.4
    test1 5.5.5.5

    然后对 ip 字段做索引,是这样嘛?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5742 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 03:11 · PVG 11:11 · LAX 19:11 · JFK 22:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.