0

我正在尝试将传入请求的远程 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: \"\""

我尝试修剪ipwithstrings.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"`
}
4

0 回答 0