【问题标题】:How to store ipv4 and ipv6 addresses in postgresql using GORM如何使用 GORM 在 postgresql 中存储 ipv4 和 ipv6 地址
【发布时间】:2022-08-21 20:29:06
【问题描述】:

我们如何使用 GORM 和 postgresql 从带有 inet 数据类型的表中插入和选择 IP 地址?

这是我的模型

import (
    \"github.com/jackc/pgtype\"
)

...
ClientIp     pgtype.Inet `json:\"client_ip\" gorm:\"type:inet;not null\"`
...

我正在尝试解析字符串格式的 IP 地址以在 postgresql 数据库中键入 pgtype.Inet 插入数据库时​​像这样

import (
    \"net\"
)

...
ClientIp:     net.ParseIP(c.IP()),
...

我们被告知parse the ip using net package,但这是错误的

cannot use net.ParseIP(c.IP()) (type net.IP) as type pgtype.Inet in field value

我也尝试过为模型使用net

import (
    \"net\"
)

...
ClientIp     net.IP `json:\"client_ip\" gorm:\"type:inet;not null\"`
...

但不断收到此错误

sql: Scan error on column index 16, name \"client_ip\": unsupported Scan, storing driver.Value type string into type *net.IP

所以我们如何使用 GORM 在 postgresql 中存储 inet 值?

  • this 有帮助吗? (pgtype.Inet 暗示你正在使用sqlx,但你没有提到。)另见this
  • 不要使用 gorm,因为这里也提到了 github.com/go-gorm/gorm/issues/3150
  • 我需要导入另一个包吗?我看到了这个github.com/jackc/pgx/issues/914,但不确定我需要添加/删除什么才能让它与 gorm 一起使用
  • @kostix 更新了问题,提供了正在使用的软件包的更多详细信息。如果我需要添加更多包,请告诉我。谢谢
  • 您是否尝试过实际阅读pgtype.Inet.Set 的源代码?它返回什么?你明白它是如何工作的吗?我的意思是,作为 SO 的志愿者(是的,这是一个可以让您获得无偿帮助的资源),我只愿意帮助完成有趣的任务,而不是辅导特定语言的基础知识或阅读现成的给你的源代码。这对我来说并不感兴趣,并且与任何无偿帮助一样,这是“接受或离开”的事情。你以为我帮不上忙?我不同意,但没关系:如果你不想举手帮助自己,那就顺其自然吧。

标签: sql postgresql go ip-address go-gorm


【解决方案1】:

你可以像这样创建 func SetInet

func SetInet(ip string) pgtype.Inet {
    var inet pgtype.Inet
    inet.Set(ip)
    return inet
}

那么您可以使用该函数来设置 inet :

...
ClientIp:     SetInet("127.0.0.1"),
...

【讨论】:

  • 我必须做所有这些来存储 IP 地址吗?哇...感谢您的帮助。将很快对此进行测试,并让您知道情况如何
  • 测试你的答案有点困难,因为你添加的不仅仅是在数据库中存储和检索 ip,我已经有了结构模型和数据库,我需要的只是存储 ip 地址的列;仍然试图从你的答案中找出我需要的东西。最好让答案坚持问题的原始代码以使事情变得简单
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 2014-05-03
  • 2012-05-22
  • 1970-01-01
  • 2014-12-19
  • 2011-06-09
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多