问题描述
为了简化代码,防止重复传递类似的参数,我为一些结构创建了一个方法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}
})