2 回答

TA贡献1779条经验 获得超6个赞
从您收到的错误中:
expected 2 arguments, got 3
我怀疑$3
在 SQL 引号内的查询中不会被解释为参数。另外据我所知,这不是在 postgres 中使用参数间隔的正确方法。正确的方法是写interval '1 day' * $1
所以我认为如果您将代码更改为:
stmt := `INSERT INTO widgets (title, content, created, expires) VALUES($1, $2, NOW(), NOW() + INTERVAL '1 day' * $3) RETURNING id;`
它会起作用的。但请确保将expires
参数更改为 int 类型。

TA贡献1890条经验 获得超9个赞
'$3 day' 您不能将查询参数作为字符串文字的一部分传递。
尝试将所有INTERVAL '$3 day'部分替换为参数。像这个。
func (m *WidgetModel) Insert(title, content, expires string) (int, error) {
stmt := `
INSERT INTO widgets (title, content, created, expires)
VALUES ($1, $2, NOW(), NOW() + $3)
RETURNING id;`
var id int
expiresDays, err := strconv.ParseInt(expires, 10, 32)
if err != nil {
return 0, err
}
expiresInterval := pgtype.Interval{
Days: int32(expiresDays),
Status: pgtype.Present}
err = m.DB.QueryRow(context.Background(), stmt, title, content,
expiresInterval).Scan(&id)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return 0, models.ErrNoRecord
} else {
return 0, err
}
}
return 0, nil
}
- 2 回答
- 0 关注
- 174 浏览
添加回答
举报