问题描述
我正在尝试将传入请求的远程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"
"error": "pq: invalid input Syntax for type inet: \"\""
我尝试用ip
修剪strings.Trimspace(ip)
,但无济于事。
...
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 (将#修改为@)