gorm 如何存数组

2020-09-11 10:55:13 +08:00
 richzhu

各位大佬,请问如何使用 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

7268 次点击
所在节点    Go 编程语言
10 条回复
zgw0
2020-09-11 11:06:25 +08:00
我之前的做法是转了字符串存起来,然后用的时候再转回数组
z0wjqnxi
2020-09-11 11:17:26 +08:00
``` 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
2020-09-11 11:29:08 +08:00
@zgw0 谢谢老哥,咱俩想的一样,但是我这情况有点特殊,前端发来的数据结构体必须要保持[]string 的类型才可以收到,又不想大改,就没用这个方法

@z0wjqnxi 感谢大佬,无脑复制您的代码,把 node 改成 ipList 类型后,一下就成功了,爽的不要不要的~
richzhu
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
2020-09-11 11:45:37 +08:00
@z0wjqnxi 知道了 哈哈,是表中老数据的问题,打扰大佬了
Yoock
2020-09-11 12:54:02 +08:00
AfterFind hook
cszchen
2020-09-12 07:51:44 +08:00
用 postgres.jsonb 类型
reus
2020-09-12 14:34:44 +08:00
要对 ip 做查询做索引时你就知错

应该另外建表,存成多行
adrianduan
2020-09-12 21:00:58 +08:00
不知道你用的是 gorm V1 还是 V2,如果使用的 PostgreSQL 且版本为 V1 的话可以直接定义类型为 pq.StringArray,V2 好像改了 PostgreSQL 的 driver 从 pq 到 pgx,这种写法就不行了
richzhu
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 字段做索引,是这样嘛?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706059

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX