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 ( | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"strconv" | ||||
| 
 | ||||
| 	"database/sql" | ||||
| @ -11,6 +12,8 @@ type Orm struct { | ||||
| 	TableName  string | ||||
| 	PrimaryKey string | ||||
| 	Error      error | ||||
| 	Sql        string | ||||
| 	SqlVars    []interface{} | ||||
| 
 | ||||
| 	db          *sql.DB | ||||
| 	whereClause []interface{} | ||||
| @ -18,6 +21,13 @@ type Orm struct { | ||||
| 	orderStr    string | ||||
| 	offsetInt   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 { | ||||
| @ -74,10 +84,14 @@ func (s *Orm) Select(value interface{}) *Orm { | ||||
| } | ||||
| 
 | ||||
| func (s *Orm) Save(value interface{}) *Orm { | ||||
| 	s.explain(value, "Save") | ||||
| 	s.Exec() | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| func (s *Orm) Delete(value interface{}) *Orm { | ||||
| 	s.explain(value, "Delete") | ||||
| 	s.Exec() | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| @ -89,11 +103,17 @@ func (s *Orm) Updates(values map[string]string) *Orm { | ||||
| 	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 | ||||
| } | ||||
| 
 | ||||
| func (s *Orm) First(out interface{}) *Orm { | ||||
| 	s.setModel(out) | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										25
									
								
								orm_test.go
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								orm_test.go
									
									
									
									
									
								
							| @ -2,6 +2,7 @@ package gorm | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"testing" | ||||
| ) | ||||
| @ -10,14 +11,28 @@ type User struct { | ||||
| 	Name string | ||||
| } | ||||
| 
 | ||||
| func TestWhere(t *testing.T) { | ||||
| 	db, err := Open("postgres", "user=gorm dbname=gorm") | ||||
| func getDB() DB { | ||||
| 	db, _ := Open("postgres", "user=gorm dbname=gorm") | ||||
| 	return db | ||||
| } | ||||
| 
 | ||||
| 	if err != err { | ||||
| 		t.Errorf("Error should be nil") | ||||
| func TestSaveAndFirst(t *testing.T) { | ||||
| 	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{} | ||||
| 	orm.First(user) | ||||
| 	fmt.Println(user) | ||||
|  | ||||
							
								
								
									
										40
									
								
								sql.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								sql.go
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| 
 | ||||
| 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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu