如何使用GORM在PostgreSQL中存储IPv4和IPv6地址

3

如何使用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()),
...

我们被告知要使用net包来解析IP地址,但是这会导致错误。

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值呢?


请勿使用gorm,因为它在此处已经被提及 https://github.com/go-gorm/gorm/issues/3150 - uberrebu
我需要导入另一个包吗?我看了这个 https://github.com/jackc/pgx/issues/914 但不确定我需要添加/删除什么才能使其与gorm一起工作。 - uberrebu
@kostix更新了问题,并提供了我正在使用的更多软件包的详细信息。如果需要添加更多软件包,请告诉我。谢谢。 - uberrebu
让我把第一个问题留作家庭作业练习。很抱歉我有点严厉和不屑一顾,但如果你不能从代码中自己理解这个问题,我恐怕处理我们在这里处理的问题是有点过早的尝试。至于第二个问题——我不确定,因为你没有提供任何信息,但我猜这是因为你的PostgreSQL服务器中的底层字段具有inetcidr类型,并且包括如文档所述的掩码https://www.postgresql.org/docs/current/datatype-net-types.html。 - kostix
1
你有没有尝试过实际阅读pgtype.Inet.Set的源代码?它返回什么?你理解它是如何工作的吗?我的意思是,作为SO上的志愿者(是一个提供无偿帮助的资源),我只愿意帮助有趣的任务,而不是教授某种语言的基础知识或为你阅读现成的源代码。这对我来说不是有趣的事情,就像任何无偿帮助一样,这是“要么接受,要么离开”的事情。你认为我没能帮上忙?我不同意,但如果你不想自己动手帮助自己,那也没关系。 - kostix
显示剩余8条评论
1个回答

2

模型:

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

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

那么您可以像这样创建名为SetInet的函数

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

然后,您可以使用该函数来设置inet:

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

如果您不想创建这样的函数,您可以从包含字段pgtype.Inet的变量中设置它。

例如:

...
    type Ip struct {
        gorm.Model
        ClientIp pgtype.Inet `gorm:"type:inet;not null"`
    }
...
    var ip Ip

    ip.ClientIp.Set("127.0.0.1")
...


我必须做所有这些来存储IP地址吗?哇...非常感谢您的帮助。很快会测试并告诉您结果。 - uberrebu
@uberrebu 我已经更新了我的答案,只需使用inet类型存储IP地址。 - Rahmat Fathoni
更新了我的回答 @uberrebu。 - Rahmat Fathoni
我决定将IP地址存储为字符串,需要时再进行转换;我创建了这个问题,以免浪费太多时间,但最终却浪费了很多时间,因为没有人提供任何帮助,我不断地浪费日子;所以我决定使用字符串并保持理智。 - uberrebu
这个问题已经被kostix回答了,我只是给你展示一些例子。 - Rahmat Fathoni
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接