Add sql builder test
This commit is contained in:
		
							parent
							
								
									5457fe88e6
								
							
						
					
					
						commit
						749ca37eb0
					
				| @ -19,11 +19,30 @@ func Query(db *gorm.DB) { | ||||
| 	} | ||||
| 
 | ||||
| 	if db.Statement.SQL.String() == "" { | ||||
| 		BuildQuerySQL(db) | ||||
| 	} | ||||
| 
 | ||||
| 	rows, err := db.Statement.ConnPool.QueryContext(db.Statement.Context, db.Statement.SQL.String(), db.Statement.Vars...) | ||||
| 	if err != nil { | ||||
| 		db.AddError(err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer rows.Close() | ||||
| 
 | ||||
| 	gorm.Scan(rows, db, false) | ||||
| } | ||||
| 
 | ||||
| func BuildQuerySQL(db *gorm.DB) { | ||||
| 	clauseSelect := clause.Select{} | ||||
| 
 | ||||
| 	if len(db.Statement.Selects) > 0 { | ||||
| 		for _, name := range db.Statement.Selects { | ||||
| 				if f := db.Statement.Schema.LookUpField(name); f != nil { | ||||
| 			if db.Statement.Schema == nil { | ||||
| 				clauseSelect.Columns = append(clauseSelect.Columns, clause.Column{ | ||||
| 					Name: name, | ||||
| 					Raw:  true, | ||||
| 				}) | ||||
| 			} else if f := db.Statement.Schema.LookUpField(name); f != nil { | ||||
| 				clauseSelect.Columns = append(clauseSelect.Columns, clause.Column{ | ||||
| 					Name: f.DBName, | ||||
| 				}) | ||||
| @ -50,7 +69,11 @@ func Query(db *gorm.DB) { | ||||
| 		} | ||||
| 
 | ||||
| 		for name, conds := range db.Statement.Joins { | ||||
| 				if relation, ok := db.Statement.Schema.Relationships.Relations[name]; ok { | ||||
| 			if db.Statement.Schema == nil { | ||||
| 				joins = append(joins, clause.Join{ | ||||
| 					Expression: clause.Expr{SQL: name, Vars: conds}, | ||||
| 				}) | ||||
| 			} else if relation, ok := db.Statement.Schema.Relationships.Relations[name]; ok { | ||||
| 				tableAliasName := relation.Name | ||||
| 
 | ||||
| 				for _, s := range relation.FieldSchema.DBNames { | ||||
| @ -105,19 +128,10 @@ func Query(db *gorm.DB) { | ||||
| 	} else { | ||||
| 		db.Statement.AddClauseIfNotExists(clauseSelect) | ||||
| 	} | ||||
| 
 | ||||
| 	db.Statement.Build("SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR") | ||||
| } | ||||
| 
 | ||||
| 	rows, err := db.Statement.ConnPool.QueryContext(db.Statement.Context, db.Statement.SQL.String(), db.Statement.Vars...) | ||||
| 	if err != nil { | ||||
| 		db.AddError(err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer rows.Close() | ||||
| 
 | ||||
| 	gorm.Scan(rows, db, false) | ||||
| } | ||||
| 
 | ||||
| func Preload(db *gorm.DB) { | ||||
| 	if len(db.Statement.Preloads) > 0 { | ||||
| 		preloadMap := map[string][]string{} | ||||
|  | ||||
| @ -2,15 +2,11 @@ package callbacks | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/jinzhu/gorm" | ||||
| 	"github.com/jinzhu/gorm/clause" | ||||
| ) | ||||
| 
 | ||||
| func RowQuery(db *gorm.DB) { | ||||
| 	if db.Statement.SQL.String() == "" { | ||||
| 		db.Statement.AddClauseIfNotExists(clause.Select{}) | ||||
| 		db.Statement.AddClauseIfNotExists(clause.From{}) | ||||
| 
 | ||||
| 		db.Statement.Build("SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR") | ||||
| 		BuildQuerySQL(db) | ||||
| 	} | ||||
| 
 | ||||
| 	if _, ok := db.Get("rows"); ok { | ||||
|  | ||||
							
								
								
									
										82
									
								
								tests/sql_builder_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								tests/sql_builder_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | ||||
| package tests_test | ||||
| 
 | ||||
| import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/jinzhu/gorm" | ||||
| 	. "github.com/jinzhu/gorm/tests" | ||||
| ) | ||||
| 
 | ||||
| func TestRow(t *testing.T) { | ||||
| 	user1 := User{Name: "RowUser1", Age: 1} | ||||
| 	user2 := User{Name: "RowUser2", Age: 10} | ||||
| 	user3 := User{Name: "RowUser3", Age: 20} | ||||
| 	DB.Save(&user1).Save(&user2).Save(&user3) | ||||
| 
 | ||||
| 	row := DB.Table("users").Where("name = ?", user2.Name).Select("age").Row() | ||||
| 
 | ||||
| 	var age int64 | ||||
| 	if err := row.Scan(&age); err != nil { | ||||
| 		t.Fatalf("Failed to scan age, got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if age != 10 { | ||||
| 		t.Errorf("Scan with Row, age expects: %v, got %v", user2.Age, age) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestRows(t *testing.T) { | ||||
| 	user1 := User{Name: "RowsUser1", Age: 1} | ||||
| 	user2 := User{Name: "RowsUser2", Age: 10} | ||||
| 	user3 := User{Name: "RowsUser3", Age: 20} | ||||
| 	DB.Save(&user1).Save(&user2).Save(&user3) | ||||
| 
 | ||||
| 	rows, err := DB.Table("users").Where("name = ? or name = ?", user2.Name, user3.Name).Select("name, age").Rows() | ||||
| 	if err != nil { | ||||
| 		t.Errorf("Not error should happen, got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	count := 0 | ||||
| 	for rows.Next() { | ||||
| 		var name string | ||||
| 		var age int64 | ||||
| 		rows.Scan(&name, &age) | ||||
| 		count++ | ||||
| 	} | ||||
| 
 | ||||
| 	if count != 2 { | ||||
| 		t.Errorf("Should found two records") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestRaw(t *testing.T) { | ||||
| 	user1 := User{Name: "ExecRawSqlUser1", Age: 1} | ||||
| 	user2 := User{Name: "ExecRawSqlUser2", Age: 10} | ||||
| 	user3 := User{Name: "ExecRawSqlUser3", Age: 20} | ||||
| 	DB.Save(&user1).Save(&user2).Save(&user3) | ||||
| 
 | ||||
| 	type result struct { | ||||
| 		Name  string | ||||
| 		Email string | ||||
| 	} | ||||
| 
 | ||||
| 	var results []result | ||||
| 	DB.Raw("SELECT name, age FROM users WHERE name = ? or name = ?", user2.Name, user3.Name).Scan(&results) | ||||
| 	if len(results) != 2 || results[0].Name != user2.Name || results[1].Name != user3.Name { | ||||
| 		t.Errorf("Raw with scan") | ||||
| 	} | ||||
| 
 | ||||
| 	rows, _ := DB.Raw("select name, age from users where name = ?", user3.Name).Rows() | ||||
| 	count := 0 | ||||
| 	for rows.Next() { | ||||
| 		count++ | ||||
| 	} | ||||
| 	if count != 1 { | ||||
| 		t.Errorf("Raw with Rows should find one record with name 3") | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Exec("update users set name=? where name in (?)", "jinzhu", []string{user1.Name, user2.Name, user3.Name}) | ||||
| 	if DB.Where("name in (?)", []string{user1.Name, user2.Name, user3.Name}).First(&User{}).Error != gorm.ErrRecordNotFound { | ||||
| 		t.Error("Raw sql to update records") | ||||
| 	} | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu