对于那里的谷歌用户,我刚刚遇到了可怕的scannable dest type interface {} with >1 columns (XX) in result 错误。
Evan Shaw 的回答对我不起作用。这是我解决它的方法。我也在使用lann/squirrel 库,但您可以轻松地将其取出。
解决方案真的没有那么复杂,只要知道要进行的反射调用的神奇组合即可。
me.GetSqlx() 函数只是返回一个实例给*sqlx.DB
func (me *CommonRepo) Get(query sq.SelectBuilder, dest interface{}) error {
sqlst, args, err := query.ToSql()
if err != nil {
return err
}
// Do some reflection magic so that Sqlx doesn't hork on interface{}
v := reflect.ValueOf(dest)
return me.GetSqlx().Get(v.Interface(), sqlst, args...)
}
func (me *CommonRepo) Select(query sq.SelectBuilder, dest interface{}) error {
sqlst, args, err := query.ToSql()
if err != nil {
return err
}
// Do some reflection magic so that Sqlx doesn't hork on interface{}
v := reflect.ValueOf(dest)
return me.GetSqlx().Select(v.Interface(), sqlst, args...)
}
然后调用它你可以这样做:
func (me *myCustomerRepo) Get(query sq.SelectBuilder) (rec Customer, err error) {
err = me.CommonRepo.Get(query, &rec)
return
}
func (me *myCustomerRepo) Select(query sq.SelectBuilder) (recs []Customer, err error) {
err = me.CommonRepo.Select(query, &recs)
return
}
这使您可以在所有地方都拥有强类型,但在一个地方拥有所有通用逻辑(本例中为CommonRepo)。