mirror of https://github.com/go-gorm/gorm.git
Add some utils
This commit is contained in:
parent
540345f552
commit
11758c647f
22
orm.go
22
orm.go
|
@ -2,6 +2,7 @@ package gorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
@ -11,6 +12,8 @@ type Orm struct {
|
||||||
TableName string
|
TableName string
|
||||||
PrimaryKey string
|
PrimaryKey string
|
||||||
Error error
|
Error error
|
||||||
|
Sql string
|
||||||
|
SqlVars []interface{}
|
||||||
|
|
||||||
db *sql.DB
|
db *sql.DB
|
||||||
whereClause []interface{}
|
whereClause []interface{}
|
||||||
|
@ -18,6 +21,13 @@ type Orm struct {
|
||||||
orderStr string
|
orderStr string
|
||||||
offsetInt int
|
offsetInt int
|
||||||
limitInt int
|
limitInt int
|
||||||
|
operation string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Orm) setModel(model interface{}) (err error) {
|
||||||
|
s.TableName = "user"
|
||||||
|
s.PrimaryKey = "id"
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Orm) Where(querystring interface{}, args ...interface{}) *Orm {
|
func (s *Orm) Where(querystring interface{}, args ...interface{}) *Orm {
|
||||||
|
@ -74,10 +84,14 @@ func (s *Orm) Select(value interface{}) *Orm {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Orm) Save(value interface{}) *Orm {
|
func (s *Orm) Save(value interface{}) *Orm {
|
||||||
|
s.explain(value, "Save")
|
||||||
|
s.Exec()
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Orm) Delete(value interface{}) *Orm {
|
func (s *Orm) Delete(value interface{}) *Orm {
|
||||||
|
s.explain(value, "Delete")
|
||||||
|
s.Exec()
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,11 +103,17 @@ func (s *Orm) Updates(values map[string]string) *Orm {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Orm) Exec(sql string) *Orm {
|
func (s *Orm) Exec(sql ...string) *Orm {
|
||||||
|
if len(sql) == 0 {
|
||||||
|
s.db.Exec(s.Sql, s.SqlVars...)
|
||||||
|
} else {
|
||||||
|
s.db.Exec(sql[0])
|
||||||
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Orm) First(out interface{}) *Orm {
|
func (s *Orm) First(out interface{}) *Orm {
|
||||||
|
s.setModel(out)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
25
orm_test.go
25
orm_test.go
|
@ -2,6 +2,7 @@ package gorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
@ -10,14 +11,28 @@ type User struct {
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWhere(t *testing.T) {
|
func getDB() DB {
|
||||||
db, err := Open("postgres", "user=gorm dbname=gorm")
|
db, _ := Open("postgres", "user=gorm dbname=gorm")
|
||||||
|
return db
|
||||||
|
}
|
||||||
|
|
||||||
if err != err {
|
func TestSaveAndFirst(t *testing.T) {
|
||||||
t.Errorf("Error should be nil")
|
db := getDB()
|
||||||
|
u := &User{Name: "jinzhu"}
|
||||||
|
fmt.Println(db.Save(u).Sql)
|
||||||
|
|
||||||
|
fmt.Println(time.Now().String())
|
||||||
|
|
||||||
|
user := &User{}
|
||||||
|
db.First(&user)
|
||||||
|
if user.Name != "jinzhu" {
|
||||||
|
t.Errorf("User should be saved and fetched correctly")
|
||||||
}
|
}
|
||||||
orm := db.Where("id = $1", 1, 3, 4, []int64{1, 2, 3}).Where("name = $1", "jinzhu")
|
}
|
||||||
|
|
||||||
|
func TestWhere(t *testing.T) {
|
||||||
|
db := getDB()
|
||||||
|
orm := db.Where("id = $1", 1, 3, 4, []int64{1, 2, 3}).Where("name = $1", "jinzhu")
|
||||||
user := &User{}
|
user := &User{}
|
||||||
orm.First(user)
|
orm.First(user)
|
||||||
fmt.Println(user)
|
fmt.Println(user)
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
package gorm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *Orm) explain(value interface{}, operation string) {
|
||||||
|
s.setModel(value)
|
||||||
|
switch operation {
|
||||||
|
case "Save":
|
||||||
|
s.saveSql(value)
|
||||||
|
case "Delete":
|
||||||
|
s.deleteSql(value)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Orm) saveSql(value interface{}) {
|
||||||
|
columns, values := modelValues(value)
|
||||||
|
s.Sql = fmt.Sprintf(
|
||||||
|
"INSERT INTO %v (%v) VALUES (%v)",
|
||||||
|
s.TableName,
|
||||||
|
strings.Join(columns, ","),
|
||||||
|
valuesToBinVar(values),
|
||||||
|
)
|
||||||
|
s.SqlVars = values
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Orm) deleteSql(value interface{}) {
|
||||||
|
s.Sql = fmt.Sprintf("DELETE FROM %v WHERE %v", s.TableName, s.whereSql)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Orm) whereSql() (sql string) {
|
||||||
|
sql = "1=1"
|
||||||
|
return
|
||||||
|
}
|
28
utils.go
28
utils.go
|
@ -1 +1,29 @@
|
||||||
package gorm
|
package gorm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func modelValues(m interface{}) (columns []string, values []interface{}) {
|
||||||
|
typ := reflect.TypeOf(m).Elem()
|
||||||
|
|
||||||
|
for i := 0; i < typ.NumField(); i++ {
|
||||||
|
p := typ.Field(i)
|
||||||
|
if !p.Anonymous {
|
||||||
|
columns = append(columns, strings.ToLower(p.Name))
|
||||||
|
value := reflect.ValueOf(m).Elem().FieldByName(p.Name)
|
||||||
|
values = append(values, value.Interface())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func valuesToBinVar(values []interface{}) string {
|
||||||
|
var sqls []string
|
||||||
|
for index, _ := range values {
|
||||||
|
sqls = append(sqls, fmt.Sprintf("$%d", index+1))
|
||||||
|
}
|
||||||
|
return strings.Join(sqls, ",")
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue