Fix LastInsertID with string primary key
This commit is contained in:
		
							parent
							
								
									e64785573d
								
							
						
					
					
						commit
						2ca4e91d88
					
				| @ -234,7 +234,6 @@ func SaveAfterAssociations(db *gorm.DB) { | |||||||
| 						ref.ForeignKey.Set(joinValue, fv) | 						ref.ForeignKey.Set(joinValue, fv) | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 
 |  | ||||||
| 				joins = reflect.Append(joins, joinValue) | 				joins = reflect.Append(joins, joinValue) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -277,7 +276,7 @@ func SaveAfterAssociations(db *gorm.DB) { | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if joins.Len() > 0 { | 			if joins.Len() > 0 { | ||||||
| 				db.Session(&gorm.Session{}).Create(joins.Interface()) | 				db.Session(&gorm.Session{}).Debug().Create(joins.Interface()) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -56,25 +56,27 @@ func Create(config *Config) func(db *gorm.DB) { | |||||||
| 
 | 
 | ||||||
| 			if err == nil { | 			if err == nil { | ||||||
| 				if db.Statement.Schema != nil { | 				if db.Statement.Schema != nil { | ||||||
| 					if insertID, err := result.LastInsertId(); err == nil { | 					if _, ok := db.Statement.Schema.FieldsWithDefaultDBValue[db.Statement.Schema.PrioritizedPrimaryField.DBName]; ok { | ||||||
| 						switch db.Statement.ReflectValue.Kind() { | 						if insertID, err := result.LastInsertId(); err == nil { | ||||||
| 						case reflect.Slice, reflect.Array: | 							switch db.Statement.ReflectValue.Kind() { | ||||||
| 							if config.LastInsertIDReversed { | 							case reflect.Slice, reflect.Array: | ||||||
| 								for i := db.Statement.ReflectValue.Len() - 1; i >= 0; i-- { | 								if config.LastInsertIDReversed { | ||||||
| 									db.Statement.Schema.PrioritizedPrimaryField.Set(db.Statement.ReflectValue.Index(i), insertID) | 									for i := db.Statement.ReflectValue.Len() - 1; i >= 0; i-- { | ||||||
| 									insertID-- | 										db.Statement.Schema.PrioritizedPrimaryField.Set(db.Statement.ReflectValue.Index(i), insertID) | ||||||
| 								} | 										insertID-- | ||||||
| 							} else { | 									} | ||||||
| 								for i := 0; i < db.Statement.ReflectValue.Len(); i++ { | 								} else { | ||||||
| 									db.Statement.Schema.PrioritizedPrimaryField.Set(db.Statement.ReflectValue.Index(i), insertID) | 									for i := 0; i < db.Statement.ReflectValue.Len(); i++ { | ||||||
| 									insertID++ | 										db.Statement.Schema.PrioritizedPrimaryField.Set(db.Statement.ReflectValue.Index(i), insertID) | ||||||
|  | 										insertID++ | ||||||
|  | 									} | ||||||
| 								} | 								} | ||||||
|  | 							case reflect.Struct: | ||||||
|  | 								db.Statement.Schema.PrioritizedPrimaryField.Set(db.Statement.ReflectValue, insertID) | ||||||
| 							} | 							} | ||||||
| 						case reflect.Struct: | 						} else { | ||||||
| 							db.Statement.Schema.PrioritizedPrimaryField.Set(db.Statement.ReflectValue, insertID) | 							db.AddError(err) | ||||||
| 						} | 						} | ||||||
| 					} else { |  | ||||||
| 						db.AddError(err) |  | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 				db.RowsAffected, _ = result.RowsAffected() | 				db.RowsAffected, _ = result.RowsAffected() | ||||||
|  | |||||||
| @ -1,97 +0,0 @@ | |||||||
| package tests |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"log" |  | ||||||
| 	"math/rand" |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"testing" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"github.com/jinzhu/gorm" |  | ||||||
| 	"github.com/jinzhu/gorm/dialects/mssql" |  | ||||||
| 	"github.com/jinzhu/gorm/dialects/mysql" |  | ||||||
| 	"github.com/jinzhu/gorm/dialects/postgres" |  | ||||||
| 	"github.com/jinzhu/gorm/dialects/sqlite" |  | ||||||
| 	"github.com/jinzhu/gorm/logger" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var DB *gorm.DB |  | ||||||
| 
 |  | ||||||
| func TestMain(m *testing.M) { |  | ||||||
| 	var err error |  | ||||||
| 	DB, err = OpenTestConnection() |  | ||||||
| 	if err == nil { |  | ||||||
| 		RunMigrations() |  | ||||||
| 		m.Run() |  | ||||||
| 	} else { |  | ||||||
| 		log.Printf("failed to connect database, got error %v\n", err) |  | ||||||
| 		os.Exit(1) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func RunMigrations() { |  | ||||||
| 	var err error |  | ||||||
| 	allModels := []interface{}{&User{}, &Account{}, &Pet{}, &Company{}, &Toy{}, &Language{}} |  | ||||||
| 	rand.Seed(time.Now().UnixNano()) |  | ||||||
| 	rand.Shuffle(len(allModels), func(i, j int) { allModels[i], allModels[j] = allModels[j], allModels[i] }) |  | ||||||
| 
 |  | ||||||
| 	DB.Migrator().DropTable("user_friends", "user_speak") |  | ||||||
| 
 |  | ||||||
| 	if err = DB.Migrator().DropTable(allModels...); err != nil { |  | ||||||
| 		log.Printf("Failed to drop table, got error %v\n", err) |  | ||||||
| 		os.Exit(1) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if err = DB.AutoMigrate(allModels...); err != nil { |  | ||||||
| 		log.Printf("Failed to auto migrate, but got error %v\n", err) |  | ||||||
| 		os.Exit(1) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for _, m := range allModels { |  | ||||||
| 		if !DB.Migrator().HasTable(m) { |  | ||||||
| 			log.Printf("Failed to create table for %#v\n", m) |  | ||||||
| 			os.Exit(1) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func OpenTestConnection() (db *gorm.DB, err error) { |  | ||||||
| 	dbDSN := os.Getenv("GORM_DSN") |  | ||||||
| 	switch os.Getenv("GORM_DIALECT") { |  | ||||||
| 	case "mysql": |  | ||||||
| 		log.Println("testing mysql...") |  | ||||||
| 		if dbDSN == "" { |  | ||||||
| 			dbDSN = "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local" |  | ||||||
| 		} |  | ||||||
| 		db, err = gorm.Open(mysql.Open(dbDSN), &gorm.Config{}) |  | ||||||
| 	case "postgres": |  | ||||||
| 		log.Println("testing postgres...") |  | ||||||
| 		if dbDSN == "" { |  | ||||||
| 			dbDSN = "user=gorm password=gorm DB.name=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai" |  | ||||||
| 		} |  | ||||||
| 		db, err = gorm.Open(postgres.Open(dbDSN), &gorm.Config{}) |  | ||||||
| 	case "mssql": |  | ||||||
| 		// CREATE LOGIN gorm WITH PASSWORD = 'LoremIpsum86';
 |  | ||||||
| 		// CREATE DATABASE gorm;
 |  | ||||||
| 		// USE gorm;
 |  | ||||||
| 		// CREATE USER gorm FROM LOGIN gorm;
 |  | ||||||
| 		// sp_changedbowner 'gorm';
 |  | ||||||
| 		log.Println("testing mssql...") |  | ||||||
| 		if dbDSN == "" { |  | ||||||
| 			dbDSN = "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm" |  | ||||||
| 		} |  | ||||||
| 		db, err = gorm.Open(mssql.Open(dbDSN), &gorm.Config{}) |  | ||||||
| 	default: |  | ||||||
| 		log.Println("testing sqlite3...") |  | ||||||
| 		db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db")), &gorm.Config{}) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if debug := os.Getenv("DEBUG"); debug == "true" { |  | ||||||
| 		db.Logger.LogMode(logger.Info) |  | ||||||
| 	} else if debug == "false" { |  | ||||||
| 		db.Logger.LogMode(logger.Error) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| @ -1,24 +1,99 @@ | |||||||
| package tests | package tests | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"log" | ||||||
|  | 	"math/rand" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/jinzhu/gorm" | 	"github.com/jinzhu/gorm" | ||||||
|  | 	"github.com/jinzhu/gorm/dialects/mssql" | ||||||
|  | 	"github.com/jinzhu/gorm/dialects/mysql" | ||||||
|  | 	"github.com/jinzhu/gorm/dialects/postgres" | ||||||
|  | 	"github.com/jinzhu/gorm/dialects/sqlite" | ||||||
|  | 	"github.com/jinzhu/gorm/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var DB *gorm.DB | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	var err error | ||||||
|  | 	if DB, err = OpenTestConnection(); err == nil { | ||||||
|  | 		RunMigrations() | ||||||
|  | 	} else { | ||||||
|  | 		log.Printf("failed to connect database, got error %v\n", err) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func OpenTestConnection() (db *gorm.DB, err error) { | ||||||
|  | 	dbDSN := os.Getenv("GORM_DSN") | ||||||
|  | 	switch os.Getenv("GORM_DIALECT") { | ||||||
|  | 	case "mysql": | ||||||
|  | 		log.Println("testing mysql...") | ||||||
|  | 		if dbDSN == "" { | ||||||
|  | 			dbDSN = "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local" | ||||||
|  | 		} | ||||||
|  | 		db, err = gorm.Open(mysql.Open(dbDSN), &gorm.Config{}) | ||||||
|  | 	case "postgres": | ||||||
|  | 		log.Println("testing postgres...") | ||||||
|  | 		if dbDSN == "" { | ||||||
|  | 			dbDSN = "user=gorm password=gorm DB.name=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai" | ||||||
|  | 		} | ||||||
|  | 		db, err = gorm.Open(postgres.Open(dbDSN), &gorm.Config{}) | ||||||
|  | 	case "mssql": | ||||||
|  | 		// CREATE LOGIN gorm WITH PASSWORD = 'LoremIpsum86';
 | ||||||
|  | 		// CREATE DATABASE gorm;
 | ||||||
|  | 		// USE gorm;
 | ||||||
|  | 		// CREATE USER gorm FROM LOGIN gorm;
 | ||||||
|  | 		// sp_changedbowner 'gorm';
 | ||||||
|  | 		log.Println("testing mssql...") | ||||||
|  | 		if dbDSN == "" { | ||||||
|  | 			dbDSN = "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm" | ||||||
|  | 		} | ||||||
|  | 		db, err = gorm.Open(mssql.Open(dbDSN), &gorm.Config{}) | ||||||
|  | 	default: | ||||||
|  | 		log.Println("testing sqlite3...") | ||||||
|  | 		db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db")), &gorm.Config{}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if debug := os.Getenv("DEBUG"); debug == "true" { | ||||||
|  | 		db.Logger.LogMode(logger.Info) | ||||||
|  | 	} else if debug == "false" { | ||||||
|  | 		db.Logger.LogMode(logger.Error) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func RunMigrations() { | ||||||
|  | 	var err error | ||||||
|  | 	allModels := []interface{}{&User{}, &Account{}, &Pet{}, &Company{}, &Toy{}, &Language{}} | ||||||
|  | 	rand.Seed(time.Now().UnixNano()) | ||||||
|  | 	rand.Shuffle(len(allModels), func(i, j int) { allModels[i], allModels[j] = allModels[j], allModels[i] }) | ||||||
|  | 
 | ||||||
|  | 	DB.Migrator().DropTable("user_friends", "user_speak") | ||||||
|  | 
 | ||||||
|  | 	if err = DB.Migrator().DropTable(allModels...); err != nil { | ||||||
|  | 		log.Printf("Failed to drop table, got error %v\n", err) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err = DB.AutoMigrate(allModels...); err != nil { | ||||||
|  | 		log.Printf("Failed to auto migrate, but got error %v\n", err) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, m := range allModels { | ||||||
|  | 		if !DB.Migrator().HasTable(m) { | ||||||
|  | 			log.Printf("Failed to create table for %#v\n", m) | ||||||
|  | 			os.Exit(1) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func Now() *time.Time { | func Now() *time.Time { | ||||||
| 	now := time.Now() | 	now := time.Now() | ||||||
| 	return &now | 	return &now | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func RunTestsSuit(t *testing.T, db *gorm.DB) { |  | ||||||
| 	// TestCreate(t, db)
 |  | ||||||
| 	TestFind(t, db) |  | ||||||
| 	TestUpdate(t, db) |  | ||||||
| 	TestDelete(t, db) |  | ||||||
| 
 |  | ||||||
| 	TestGroupBy(t, db) |  | ||||||
| 	TestJoins(t, db) |  | ||||||
| 	TestAssociations(t, db) |  | ||||||
| } |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu