mirror of
https://github.com/gohouse/gorose.git
synced 2025-12-24 12:47:55 +08:00
listTo,valueTo
This commit is contained in:
13
database.go
13
database.go
@@ -501,13 +501,17 @@ func (db *Database) Bind(obj any) (err error) {
|
||||
|
||||
// ListTo 获取指定列的值列表。
|
||||
func (db *Database) ListTo(column string, obj any) (err error) {
|
||||
return db.Select(column).toBind(obj)
|
||||
}
|
||||
func (db *Database) ListTo2(column string, obj any) (err error) {
|
||||
ress, err := db.Get(column)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rfv := reflect.Indirect(reflect.ValueOf(obj))
|
||||
for _, v := range ress {
|
||||
rfv.Set(reflect.Append(rfv, reflect.ValueOf(v[column])))
|
||||
rfv2 := reflect.ValueOf(v)
|
||||
rfv.Set(reflect.Append(rfv, rfv2.MapIndex(rfv2.MapKeys()[0])))
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -527,6 +531,13 @@ func (db *Database) PluckTo(column string, keyColumn string, obj any) (err error
|
||||
|
||||
// ValueTo 获取指定字段的值,并绑定到给定的变量中
|
||||
func (db *Database) ValueTo(column string, obj any) (err error) {
|
||||
prepare, values, err := db.Select(column).ToSql()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return db.QueryRow(prepare, values...).Scan(obj)
|
||||
}
|
||||
func (db *Database) ValueTo2(column string, obj any) (err error) {
|
||||
first, err := db.First(column)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
16
engin.go
16
engin.go
@@ -142,7 +142,8 @@ func (s *Engin) rowsToBind(rows *sql.Rows, bind any) (err error) {
|
||||
case reflect.Struct:
|
||||
return s.rowsToStruct(rows, rfv)
|
||||
default:
|
||||
return errors.New("only struct(slice) or map(slice) supported")
|
||||
return s.rowsToSliceOnly(rows, rfv)
|
||||
//return errors.New("only struct(slice) or map(slice) supported")
|
||||
}
|
||||
case reflect.Map:
|
||||
return s.rowsToMap(rows, rfv)
|
||||
@@ -270,3 +271,16 @@ func (s *Engin) rowsToMap(rows *sql.Rows, rfv reflect.Value) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (s *Engin) rowsToSliceOnly(rows *sql.Rows, rfv reflect.Value) error {
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
val := reflect.Indirect(reflect.New(rfv.Type().Elem()))
|
||||
err := rows.Scan(val.Addr().Interface())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rfv.Set(reflect.Append(rfv, val))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user