向 lib/pq 传递足够多的参数

问题描述

为了简化代码,防止重复传递类似的参数,我为一些结构创建了一个方法Put,如下所示。
例如,此处未使用 UID 的原因是将 UID 设置为自动增加值。

type User struct {
    UID      int
    Name     string
    Username string
    Password string
}

func (user *User) Put(db *sql.DB,query string) (sql.Result,error) {
    return db.Exec(query,u.UID,u.Name,u.Username,u.Password)
}

func main() {
    db := ...
    u := &User{...}

    u.Put(db,`INSERT INTO user(name,username,password) VALUES ($2,$3,$4);`)
}

但我收到以下错误

pq: could not determine data type of parameter $1

(SQL 驱动程序是 https://github.com/lib/pq

解决方法

在您的查询中,$2,$3...$N 是作为额外参数传入 db.Exec() 的参数的索引,它们必须从 $1 开始(如果您使用 database/sql 包).

我认为在您的情况下您可以更改 Put 方法签名(添加 struct values extractor

func (user *User) Put(db *sql.DB,query string,extractor func(user User)[]interface{}) (sql.Result,error) {
    return db.Exec(query,extractor(*user)...)
}

并使用一个喜欢

u.Put(db,`INSERT INTO user(name,username,password) VALUES ($1,$2,$3);`,func(u User) []interface{} {
    return []interface{}{u.Name,u.Username,u.Password}
})

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...