Для googlers я просто столкнулся с ужасной ошибкой scannable dest type interface {} with >1 columns (XX) in result
.
Ответ Эвана Шоу у меня не сработал.Вот как я это решил.Я также использую библиотеку 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...)
}
. Затем, чтобы вызвать его, вы можете сделать:вся общая логика в одном месте (CommonRepo
в этом примере).