如何使用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 (将#修改为@)