Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions callbacks/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ func Preload(db *gorm.DB) {
return
}
preloadDB.Statement.ReflectValue = db.Statement.ReflectValue
preloadDB.Statement.Unscoped = db.Statement.Unscoped

for _, name := range preloadNames {
if rel := preloadDB.Statement.Schema.Relationships.Relations[name]; rel != nil {
Expand Down
12 changes: 7 additions & 5 deletions clause/select_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,18 @@ func TestSelect(t *testing.T) {
Exprs: []clause.Expression{
clause.Expr{
SQL: "? as name",
Vars: []interface{}{clause.Eq{
Column: clause.Column{Name: "age"},
Value: 18,
},
Vars: []interface{}{
clause.Eq{
Column: clause.Column{Name: "age"},
Value: 18,
},
},
},
},
},
}, clause.From{}},
"SELECT `age` = ? as name FROM `users`", []interface{}{18},
"SELECT `age` = ? as name FROM `users`",
[]interface{}{18},
},
}

Expand Down
4 changes: 1 addition & 3 deletions migrator/migrator.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ import (
"gorm.io/gorm/schema"
)

var (
regFullDataType = regexp.MustCompile(`\D*(\d+)\D?`)
)
var regFullDataType = regexp.MustCompile(`\D*(\d+)\D?`)

// Migrator m struct
type Migrator struct {
Expand Down
7 changes: 4 additions & 3 deletions model.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import "time"

// Model a basic GoLang struct which includes the following fields: ID, CreatedAt, UpdatedAt, DeletedAt
// It may be embedded into your model or you may build your own model without it
// type User struct {
// gorm.Model
// }
//
// type User struct {
// gorm.Model
// }
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
Expand Down
2 changes: 1 addition & 1 deletion schema/field.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
field.DataType = String
field.Serializer = v
} else {
var serializerName = field.TagSettings["JSON"]
serializerName := field.TagSettings["JSON"]
if serializerName == "" {
serializerName = field.TagSettings["SERIALIZER"]
}
Expand Down
23 changes: 12 additions & 11 deletions schema/relationship.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,16 +123,17 @@ func (schema *Schema) parseRelation(field *Field) *Relationship {
}

// User has many Toys, its `Polymorphic` is `Owner`, Pet has one Toy, its `Polymorphic` is `Owner`
// type User struct {
// Toys []Toy `gorm:"polymorphic:Owner;"`
// }
// type Pet struct {
// Toy Toy `gorm:"polymorphic:Owner;"`
// }
// type Toy struct {
// OwnerID int
// OwnerType string
// }
//
// type User struct {
// Toys []Toy `gorm:"polymorphic:Owner;"`
// }
// type Pet struct {
// Toy Toy `gorm:"polymorphic:Owner;"`
// }
// type Toy struct {
// OwnerID int
// OwnerType string
// }
func (schema *Schema) buildPolymorphicRelation(relation *Relationship, field *Field, polymorphic string) {
relation.Polymorphic = &Polymorphic{
Value: schema.Table,
Expand Down Expand Up @@ -427,7 +428,7 @@ func (schema *Schema) guessRelation(relation *Relationship, field *Field, cgl gu
foreignFields = append(foreignFields, f)
}
} else {
var primarySchemaName = primarySchema.Name
primarySchemaName := primarySchema.Name
if primarySchemaName == "" {
primarySchemaName = relation.FieldSchema.Name
}
Expand Down
9 changes: 3 additions & 6 deletions schema/serializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,7 @@ type SerializerValuerInterface interface {
}

// JSONSerializer json serializer
type JSONSerializer struct {
}
type JSONSerializer struct{}

// Scan implements serializer interface
func (JSONSerializer) Scan(ctx context.Context, field *Field, dst reflect.Value, dbValue interface{}) (err error) {
Expand Down Expand Up @@ -110,8 +109,7 @@ func (JSONSerializer) Value(ctx context.Context, field *Field, dst reflect.Value
}

// UnixSecondSerializer json serializer
type UnixSecondSerializer struct {
}
type UnixSecondSerializer struct{}

// Scan implements serializer interface
func (UnixSecondSerializer) Scan(ctx context.Context, field *Field, dst reflect.Value, dbValue interface{}) (err error) {
Expand Down Expand Up @@ -141,8 +139,7 @@ func (UnixSecondSerializer) Value(ctx context.Context, field *Field, dst reflect
}

// GobSerializer gob serializer
type GobSerializer struct {
}
type GobSerializer struct{}

// Scan implements serializer interface
func (GobSerializer) Scan(ctx context.Context, field *Field, dst reflect.Value, dbValue interface{}) (err error) {
Expand Down
8 changes: 5 additions & 3 deletions tests/connpool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,11 @@ func (c *wrapperConnPool) Ping() error {
}

// If you use BeginTx returned *sql.Tx as shown below then you can't record queries in a transaction.
// func (c *wrapperConnPool) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) {
// return c.db.BeginTx(ctx, opts)
// }
//
// func (c *wrapperConnPool) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) {
// return c.db.BeginTx(ctx, opts)
// }
//
// You should use BeginTx returned gorm.Tx which could wrap *sql.Tx then you can record all queries.
func (c *wrapperConnPool) BeginTx(ctx context.Context, opts *sql.TxOptions) (gorm.ConnPool, error) {
tx, err := c.db.BeginTx(ctx, opts)
Expand Down
1 change: 0 additions & 1 deletion tests/embedded_struct_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ func TestEmbeddedStruct(t *testing.T) {
t.Errorf("expected author %s got %s", want, post.Author.Name)
}
}

}

func TestEmbeddedPointerTypeStruct(t *testing.T) {
Expand Down
36 changes: 31 additions & 5 deletions tests/helper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"testing"
"time"

"gorm.io/gorm"

. "gorm.io/gorm/utils/tests"
)

Expand Down Expand Up @@ -74,10 +76,18 @@ func GetUser(name string, config Config) *User {
return &user
}

func CheckPetUnscoped(t *testing.T, pet Pet, expect Pet) {
doCheckPet(t, pet, expect, true)
}

func CheckPet(t *testing.T, pet Pet, expect Pet) {
doCheckPet(t, pet, expect, false)
}

func doCheckPet(t *testing.T, pet Pet, expect Pet, unscoped bool) {
if pet.ID != 0 {
var newPet Pet
if err := DB.Where("id = ?", pet.ID).First(&newPet).Error; err != nil {
if err := db(unscoped).Where("id = ?", pet.ID).First(&newPet).Error; err != nil {
t.Fatalf("errors happened when query: %v", err)
} else {
AssertObjEqual(t, newPet, pet, "ID", "CreatedAt", "UpdatedAt", "DeletedAt", "UserID", "Name")
Expand All @@ -94,10 +104,18 @@ func CheckPet(t *testing.T, pet Pet, expect Pet) {
}
}

func CheckUserUnscoped(t *testing.T, user User, expect User) {
doCheckUser(t, user, expect, true)
}

func CheckUser(t *testing.T, user User, expect User) {
doCheckUser(t, user, expect, false)
}

func doCheckUser(t *testing.T, user User, expect User, unscoped bool) {
if user.ID != 0 {
var newUser User
if err := DB.Where("id = ?", user.ID).First(&newUser).Error; err != nil {
if err := db(unscoped).Where("id = ?", user.ID).First(&newUser).Error; err != nil {
t.Fatalf("errors happened when query: %v", err)
} else {
AssertObjEqual(t, newUser, user, "ID", "CreatedAt", "UpdatedAt", "DeletedAt", "Name", "Age", "Birthday", "CompanyID", "ManagerID", "Active")
Expand All @@ -114,7 +132,7 @@ func CheckUser(t *testing.T, user User, expect User) {
t.Errorf("Account's foreign key should be saved")
} else {
var account Account
DB.First(&account, "user_id = ?", user.ID)
db(unscoped).First(&account, "user_id = ?", user.ID)
AssertObjEqual(t, account, user.Account, "ID", "CreatedAt", "UpdatedAt", "DeletedAt", "UserID", "Number")
}
}
Expand All @@ -137,7 +155,7 @@ func CheckUser(t *testing.T, user User, expect User) {
if pet == nil || expect.Pets[idx] == nil {
t.Errorf("pets#%v should equal, expect: %v, got %v", idx, expect.Pets[idx], pet)
} else {
CheckPet(t, *pet, *expect.Pets[idx])
doCheckPet(t, *pet, *expect.Pets[idx], unscoped)
}
}
})
Expand Down Expand Up @@ -174,7 +192,7 @@ func CheckUser(t *testing.T, user User, expect User) {
t.Errorf("Manager's foreign key should be saved")
} else {
var manager User
DB.First(&manager, "id = ?", *user.ManagerID)
db(unscoped).First(&manager, "id = ?", *user.ManagerID)
AssertObjEqual(t, manager, user.Manager, "ID", "CreatedAt", "UpdatedAt", "DeletedAt", "Name", "Age", "Birthday", "CompanyID", "ManagerID", "Active")
AssertObjEqual(t, manager, expect.Manager, "ID", "CreatedAt", "UpdatedAt", "DeletedAt", "Name", "Age", "Birthday", "CompanyID", "ManagerID", "Active")
}
Expand Down Expand Up @@ -246,3 +264,11 @@ func tidbSkip(t *testing.T, reason string) {
func isTiDB() bool {
return os.Getenv("GORM_DIALECT") == "tidb"
}

func db(unscoped bool) *gorm.DB {
if unscoped {
return DB.Unscoped()
} else {
return DB
}
}
3 changes: 1 addition & 2 deletions tests/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ func TestMigrate(t *testing.T) {
t.Fatalf("Failed to find index for many2many for %v %v", indexes[0], indexes[1])
}
}

}

func TestAutoMigrateInt8PG(t *testing.T) {
Expand Down Expand Up @@ -1267,7 +1266,7 @@ func (mm mockMigrator) AlterColumn(dst interface{}, field string) error {
}

func TestMigrateDonotAlterColumn(t *testing.T) {
var wrapMockMigrator = func(m gorm.Migrator) mockMigrator {
wrapMockMigrator := func(m gorm.Migrator) mockMigrator {
return mockMigrator{
Migrator: m,
}
Expand Down
37 changes: 37 additions & 0 deletions tests/preload_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -269,3 +269,40 @@ func TestPreloadWithDiffModel(t *testing.T) {

CheckUser(t, user, result.User)
}

func TestNestedPreloadWithUnscoped(t *testing.T) {
user := *GetUser("nested_preload", Config{Pets: 1})
pet := user.Pets[0]
pet.Toy = Toy{Name: "toy_nested_preload_" + strconv.Itoa(1)}
pet.Toy = Toy{Name: "toy_nested_preload_" + strconv.Itoa(2)}

if err := DB.Create(&user).Error; err != nil {
t.Fatalf("errors happened when create: %v", err)
}

var user2 User
DB.Preload("Pets.Toy").Find(&user2, "id = ?", user.ID)
CheckUser(t, user2, user)

DB.Delete(&pet)

var user3 User
DB.Preload(clause.Associations+"."+clause.Associations).Find(&user3, "id = ?", user.ID)
if len(user3.Pets) != 0 {
t.Fatalf("User.Pet[0] was deleted and should not exist.")
}

var user4 *User
DB.Preload("Pets.Toy").Find(&user4, "id = ?", user.ID)
if len(user4.Pets) != 0 {
t.Fatalf("User.Pet[0] was deleted and should not exist.")
}

var user5 User
DB.Unscoped().Preload(clause.Associations+"."+clause.Associations).Find(&user5, "id = ?", user.ID)
CheckUserUnscoped(t, user5, user)

var user6 *User
DB.Unscoped().Preload("Pets.Toy").Find(&user6, "id = ?", user.ID)
CheckUserUnscoped(t, *user6, user)
}
5 changes: 3 additions & 2 deletions tests/table_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,11 @@ func (UserWithTableNamer) TableName(namer schema.Namer) string {
}

func TestTableWithNamer(t *testing.T) {
var db, _ = gorm.Open(tests.DummyDialector{}, &gorm.Config{
db, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_",
}})
},
})

sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
return tx.Model(&UserWithTableNamer{}).Find(&UserWithTableNamer{})
Expand Down