From 7155023d16953796ad0e7880e87918cded5afe79 Mon Sep 17 00:00:00 2001 From: jetereting <1570967070@qq.com> Date: Tue, 24 Apr 2018 11:10:01 +0800 Subject: [PATCH] add RawMap --- main.go | 35 +++++++++++++++++++++++++++++++++++ main_test.go | 14 +++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index ffee4ec6..499e3e20 100644 --- a/main.go +++ b/main.go @@ -443,6 +443,41 @@ func (s *DB) Raw(sql string, values ...interface{}) *DB { return s.clone().search.Raw(true).Where(sql, values...).db } +// RawMap sql查询返回[]map[string]string类型 +func (s *DB) RawMap(sqlQuery string, sqlValues ...interface{}) (result []map[string]string, err error) { + rows, err := s.Raw(sqlQuery, sqlValues...).Rows() + if err != nil { + return + } + cols, err := rows.Columns() + if err != nil { + return + } + values := make([]sql.RawBytes, len(cols)) + scanArgs := make([]interface{}, len(values)) + for i := range values { + scanArgs[i] = &values[i] + } + for rows.Next() { + err = rows.Scan(scanArgs...) + if err != nil { + return + } + var value string + resultC := map[string]string{} + for i, col := range values { + if col == nil { + value = "NULL" + } else { + value = string(col) + } + resultC[cols[i]] = value + } + result = append(result, resultC) + } + return +} + // Exec execute raw sql func (s *DB) Exec(sql string, values ...interface{}) *DB { scope := s.NewScope(nil) diff --git a/main_test.go b/main_test.go index 66c46af0..9a3403e2 100644 --- a/main_test.go +++ b/main_test.go @@ -11,7 +11,6 @@ import ( "testing" "time" - "github.com/erikstmartin/go-testdb" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mssql" _ "github.com/jinzhu/gorm/dialects/mysql" @@ -511,6 +510,19 @@ func TestRaw(t *testing.T) { } } +func TestRawMap(t *testing.T) { + user1 := User{Name: "ExecRawSqlUser1", Age: 1, Birthday: parseTime("2000-1-1")} + user2 := User{Name: "ExecRawSqlUser2", Age: 10, Birthday: parseTime("2010-1-1")} + user3 := User{Name: "ExecRawSqlUser3", Age: 20, Birthday: parseTime("2020-1-1")} + DB.Save(&user1).Save(&user2).Save(&user3) + + datas, err := DB.TestRawMap("SELECT name, age FROM users WHERE name = ? or name = ?", user2.Name, user3.Name) + if err != nil { + t.Errorf("somethings wrong:%s", err.Error()) + return + } + fmt.Println("datas:", datas) +} func TestGroup(t *testing.T) { rows, err := DB.Select("name").Table("users").Group("name").Rows()