如何解决如何使用Go在Postgres中保存远程IP地址?
我正在尝试将传入请求的远程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 举报,一经查实,本站将立刻删除。