微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Go在Postgres中保存远程IP地址?

如何解决如何使用Go在Postgres中保存远程IP地址?

我正在尝试将传入请求的远程IP地址保存到Postgres中。我正在使用chisqlc

这是迁移:

CREATE TABLE IF NOT EXISTS ips (
    id bigserial PRIMARY KEY,ip INET
);

这是插入查询

-- name: CreateIp :one
INSERT INTO ips (
    ip
) VALUES (
    $1
) RETURNING *;

这是参数的结构:

type CreateIpParams struct {
    Ip        net.IP         `json:"ip"`
}

获取IP并对其进行解析:

...

    // Get IP from RemoteAddr
    ip,_,_ := net.SplitHostPort(r.RemoteAddr)
    log.Println(" >> ip:",reflect.ValueOf(ip)) // ::1
    log.Println(" >> ip.TypeOf:",reflect.TypeOf(ip)) // string

    if netIp := net.ParseIP(ip); netIp != nil {
        params.Ip = netIp
        log.Println(" >> netIp:",reflect.ValueOf(netIp)) // ::1
        log.Println(" >> netIp.TypeOf:",reflect.TypeOf(netIp)) // net.IP
    }

...

当我发出POST请求时,它返回:

    "error": "pq: invalid byte sequence for encoding \"UTF8\": 0x00"

如果我删除了该代码块却根本不保存ip:

    "error": "pq: invalid input Syntax for type inet: \"\""

我尝试用ip修剪strings.Trimspace(ip),但无济于事。

保存了sqlc代码

...
    params := &db.CreateIpParams{}

    // Get IP from RemoteAddr
    ip,_ := net.SplitHostPort(r.RemoteAddr)
    if netIp := net.ParseIP(ip); netIp != nil {
        params.Ip = netIp
    }

    if _,err := db.NewPg(pg).CreateIp(context.Background(),*params); err != nil {
        render.Render(w,r,ErrRender(err))
        return
    }

CreateIp代码Ip结构:

// db/user.sql.go

func (q *Queries) CreateIp(ctx context.Context,arg CreateIpParams) (Ip,error) {
    row := q.queryRow(ctx,q.createIpStmt,createIp,arg.Ip,)
    var i Ip
    err := row.Scan(
        &i.Ip,)
    return i,err
}

// db/models.go

type Ip struct {
    ID         int64          `json:"id"`
    Ip         net.IP         `json:"ip"`
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。