我正在尝试将传入请求的远程 IP 地址保存到 Postgres 中。我正在使用chi和sqlc。
这是迁移:
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"`
}