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 1/6] 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() From 25cd4600ff0a393e911caabe4c2f4fb7d84f3f2c Mon Sep 17 00:00:00 2001 From: au <1570967070@qq.com> Date: Tue, 24 Apr 2018 14:01:46 +0800 Subject: [PATCH 2/6] add go-testdb --- main_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/main_test.go b/main_test.go index 9a3403e2..2499344d 100644 --- a/main_test.go +++ b/main_test.go @@ -11,6 +11,7 @@ import ( "testing" "time" + "github.com/erikstmartin/go-testdb" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mssql" _ "github.com/jinzhu/gorm/dialects/mysql" From d2f2f75f611c35e9a23d28b0634d985d9c77d391 Mon Sep 17 00:00:00 2001 From: au <1570967070@qq.com> Date: Tue, 24 Apr 2018 14:13:57 +0800 Subject: [PATCH 3/6] delete TestRawMap --- main_test.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/main_test.go b/main_test.go index 2499344d..66c46af0 100644 --- a/main_test.go +++ b/main_test.go @@ -511,19 +511,6 @@ 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() From 2bcd0eb0d90b735006b830503b8922c4afdfcd71 Mon Sep 17 00:00:00 2001 From: jetereting <1570967070@qq.com> Date: Fri, 27 Apr 2018 13:03:26 +0800 Subject: [PATCH 4/6] RawMap --- README.md | 50 +++++++++++++++------------------------ gorm_test.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 31 deletions(-) create mode 100644 gorm_test.go diff --git a/README.md b/README.md index 0c5c7ea6..75fe2268 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,28 @@ -# GORM +# AuOrm +基于gorm 实现对原生查询的[]map[string]string{}返回 -The fantastic ORM library for Golang, aims to be developer friendly. +- 支持增删改查 +- 支持事物操作 -[![go report card](https://goreportcard.com/badge/github.com/jinzhu/gorm "go report card")](https://goreportcard.com/report/github.com/jinzhu/gorm) -[![wercker status](https://app.wercker.com/status/8596cace912c9947dd9c8542ecc8cb8b/s/master "wercker status")](https://app.wercker.com/project/byKey/8596cace912c9947dd9c8542ecc8cb8b) -[![Join the chat at https://gitter.im/jinzhu/gorm](https://img.shields.io/gitter/room/jinzhu/gorm.svg)](https://gitter.im/jinzhu/gorm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Open Collective Backer](https://opencollective.com/gorm/tiers/backer/badge.svg?label=backer&color=brightgreen "Open Collective Backer")](https://opencollective.com/gorm) -[![Open Collective Sponsor](https://opencollective.com/gorm/tiers/sponsor/badge.svg?label=sponsor&color=brightgreen "Open Collective Sponsor")](https://opencollective.com/gorm) -[![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.svg)](http://opensource.org/licenses/MIT) -[![GoDoc](https://godoc.org/github.com/jinzhu/gorm?status.svg)](https://godoc.org/github.com/jinzhu/gorm) +Installation +------------ -## Overview +Use go get. -* Full-Featured ORM (almost) -* Associations (Has One, Has Many, Belongs To, Many To Many, Polymorphism) -* Hooks (Before/After Create/Save/Update/Delete/Find) -* Preloading (eager loading) -* Transactions -* Composite Primary Key -* SQL Builder -* Auto Migrations -* Logger -* Extendable, write Plugins based on GORM callbacks -* Every feature comes with tests -* Developer Friendly + go get github.com/Jetereting/gorm -## Getting Started +Then import the validator package into your own code. -* GORM Guides [http://gorm.io](http://gorm.io) + import "github.com/Jetereting/gorm" -## Contributing +示例: +```golang +datas, e := DB.RawMap("select * from users where user_id=?", 123) +if e != nil { + fmt.Println("err:", e) +} +fmt.Println("datas:", datas) +``` -[You can help to deliver a better GORM, check out things you can do](http://gorm.io/contribute.html) +更多示例参照: [Au-ORM 测试](https://github.com/Jetereting/gorm/master/gorm_test.go) -## License - -© Jinzhu, 2013~time.Now - -Released under the [MIT License](https://github.com/jinzhu/gorm/blob/master/License) diff --git a/gorm_test.go b/gorm_test.go new file mode 100644 index 00000000..2837d768 --- /dev/null +++ b/gorm_test.go @@ -0,0 +1,66 @@ +package gorm + +import ( + "fmt" + "testing" + + "github.com/Jetereting/gorm" + _ "github.com/go-sql-driver/mysql" +) + +var ( + db *gorm.DB + err error +) + +func init() { + db, err = gorm.Open("mysql", "user:password@tcp(ip:port)/dbName?charset=utf8") + if err != nil { + fmt.Println(err) + return + } +} + +// TestQuery 测试查询 +func TestQuery(t *testing.T) { + datas, e := db.RawMap("select * from users where user_id=?", 123) + if e != nil { + fmt.Println("err:", e) + } + fmt.Println("datas:", datas) +} + +// TestIsCanInsert 测试插入 +func TestIsCanInsert(t *testing.T) { + _, e := db.RawMap("insert into users(user_id,user_name,user_tag) values (?,?,?)", 123, "testName", "testTag") + if e != nil { + fmt.Println("err:", e) + } + fmt.Println("It work!") +} + +// TestIsCanUpdate 测试更新 +func TestIsCanUpdate(t *testing.T) { + _, e := db.RawMap("update users set user_name=? where user_id=?", "testName2", 123) + if e != nil { + fmt.Println("err:", e) + } + fmt.Println("It work!") +} + +// TestTX 测试事物 +func TestTX(t *testing.T) { + tx := db.Begin() + _, e := tx.RawMap("update users set user_name=? where user_id=?", "testName3", 123) + if e != nil { + fmt.Println("err:", e) + tx.Rollback() + } + _, e = tx.RawMap("update users set user_name=? where user_id=?", "long text....long text....long text....long text....long text....long text....long text....", 123) + if e != nil { + fmt.Println("err:", e) + tx.Rollback() + } + tx.Commit() + fmt.Println("done!") +} From 2277b0cde416e1231d668b90a48faf7fc9b90565 Mon Sep 17 00:00:00 2001 From: jetereting <1570967070@qq.com> Date: Fri, 27 Apr 2018 13:05:49 +0800 Subject: [PATCH 5/6] RawMap --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 75fe2268..df36e947 100644 --- a/README.md +++ b/README.md @@ -24,5 +24,5 @@ if e != nil { fmt.Println("datas:", datas) ``` -更多示例参照: [Au-ORM 测试](https://github.com/Jetereting/gorm/master/gorm_test.go) +更多示例参照: [Au-ORM 测试](https://github.com/Jetereting/gorm/blob/master/gorm_test.go) From ee574ae9b817df03391e74e0619037c55b068fa1 Mon Sep 17 00:00:00 2001 From: Au <1570967070@qq.com> Date: Fri, 27 Apr 2018 13:09:17 +0800 Subject: [PATCH 6/6] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index df36e947..c3eb3acf 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Then import the validator package into your own code. 示例: ```golang -datas, e := DB.RawMap("select * from users where user_id=?", 123) +datas, e := db.RawMap("select * from users where user_id=?", 123) if e != nil { fmt.Println("err:", e) }