From 49b01a3e9372b1a6c3cef096a92f3efdd362c174 Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Thu, 29 May 2025 14:23:57 +0800 Subject: [PATCH] Fix Generics Scan, close https://github.com/go-gorm/playground/pull/803 --- generics.go | 2 +- tests/generics_test.go | 23 ++++++++++ tests/go.mod | 12 +++--- tests/migrate_test.go | 97 ------------------------------------------ 4 files changed, 29 insertions(+), 105 deletions(-) diff --git a/generics.go b/generics.go index ad2d063f..f3c3e553 100644 --- a/generics.go +++ b/generics.go @@ -567,7 +567,7 @@ func (g execG[T]) First(ctx context.Context) (T, error) { func (g execG[T]) Scan(ctx context.Context, result interface{}) error { var r T - err := g.g.apply(ctx).Model(r).Find(&result).Error + err := g.g.apply(ctx).Model(r).Find(result).Error return err } diff --git a/tests/generics_test.go b/tests/generics_test.go index 9a7c9ddd..9357f5e1 100644 --- a/tests/generics_test.go +++ b/tests/generics_test.go @@ -12,6 +12,7 @@ import ( "sync" "testing" + "github.com/google/uuid" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/clause" @@ -850,3 +851,25 @@ func TestGenericsToSQL(t *testing.T) { t.Errorf("ToSQL: got wrong sql with Generics API %v", sql) } } + +func TestGenericsScanUUID(t *testing.T) { + ctx := context.Background() + users := []User{ + {Name: uuid.NewString(), Age: 21}, + {Name: uuid.NewString(), Age: 22}, + {Name: uuid.NewString(), Age: 23}, + } + + if err := gorm.G[User](DB).CreateInBatches(ctx, &users, 2); err != nil { + t.Fatalf("CreateInBatches failed: %v", err) + } + + userIds := []uuid.UUID{} + if err := gorm.G[User](DB).Select("name").Where("id in ?", []uint{users[0].ID, users[1].ID, users[2].ID}).Order("age").Scan(ctx, &userIds); err != nil || len(users) != 3 { + t.Fatalf("Scan failed: %v, userids %v", err, userIds) + } + + if userIds[0].String() != users[0].Name || userIds[1].String() != users[1].Name || userIds[2].String() != users[2].Name { + t.Fatalf("wrong uuid scanned") + } +} diff --git a/tests/go.mod b/tests/go.mod index 1c644f31..d5e23efa 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -8,10 +8,10 @@ require ( github.com/lib/pq v1.10.9 github.com/stretchr/testify v1.10.0 gorm.io/driver/mysql v1.5.7 - gorm.io/driver/postgres v1.5.11 + gorm.io/driver/postgres v1.6.0 gorm.io/driver/sqlite v1.5.7 - gorm.io/driver/sqlserver v1.5.4 - gorm.io/gorm v1.26.1 + gorm.io/driver/sqlserver v1.6.0 + gorm.io/gorm v1.30.0 ) require ( @@ -23,6 +23,7 @@ require ( github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.5 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-sqlite3 v1.14.28 // indirect @@ -30,12 +31,9 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect golang.org/x/crypto v0.38.0 // indirect + golang.org/x/sync v0.14.0 // indirect golang.org/x/text v0.25.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) replace gorm.io/gorm => ../ - -replace github.com/jackc/pgx/v5 => github.com/jackc/pgx/v5 v5.4.3 - -replace github.com/microsoft/go-mssqldb => github.com/microsoft/go-mssqldb v1.7.0 diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 6c8a4216..f73272e8 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -5,7 +5,6 @@ import ( "database/sql" "fmt" "math/rand" - "os" "reflect" "strconv" "strings" @@ -17,7 +16,6 @@ import ( "gorm.io/gorm" "gorm.io/gorm/clause" - "gorm.io/gorm/logger" "gorm.io/gorm/migrator" "gorm.io/gorm/schema" "gorm.io/gorm/utils" @@ -1211,101 +1209,6 @@ func TestInvalidCachedPlanSimpleProtocol(t *testing.T) { } } -func TestInvalidCachedPlanPrepareStmt(t *testing.T) { - if DB.Dialector.Name() != "postgres" { - return - } - - db, err := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{PrepareStmt: true}) - if err != nil { - t.Errorf("Open err:%v", err) - } - if debug := os.Getenv("DEBUG"); debug == "true" { - db.Logger = db.Logger.LogMode(logger.Info) - } else if debug == "false" { - db.Logger = db.Logger.LogMode(logger.Silent) - } - - type Object1 struct { - ID uint - } - type Object2 struct { - ID uint - Field1 int `gorm:"type:int8"` - } - type Object3 struct { - ID uint - Field1 int `gorm:"type:int4"` - } - type Object4 struct { - ID uint - Field2 int - } - db.Migrator().DropTable("objects") - - err = db.Table("objects").AutoMigrate(&Object1{}) - if err != nil { - t.Errorf("AutoMigrate err:%v", err) - } - err = db.Table("objects").Create(&Object1{}).Error - if err != nil { - t.Errorf("create err:%v", err) - } - - // AddColumn - err = db.Table("objects").AutoMigrate(&Object2{}) - if err != nil { - t.Errorf("AutoMigrate err:%v", err) - } - - err = db.Table("objects").Take(&Object2{}).Error - if err != nil { - t.Errorf("take err:%v", err) - } - - // AlterColumn - err = db.Table("objects").AutoMigrate(&Object3{}) - if err != nil { - t.Errorf("AutoMigrate err:%v", err) - } - - err = db.Table("objects").Take(&Object3{}).Error - if err != nil { - t.Errorf("take err:%v", err) - } - - // AddColumn - err = db.Table("objects").AutoMigrate(&Object4{}) - if err != nil { - t.Errorf("AutoMigrate err:%v", err) - } - - err = db.Table("objects").Take(&Object4{}).Error - if err != nil { - t.Errorf("take err:%v", err) - } - - db.Table("objects").Migrator().RenameColumn(&Object4{}, "field2", "field3") - if err != nil { - t.Errorf("RenameColumn err:%v", err) - } - - err = db.Table("objects").Take(&Object4{}).Error - if err != nil { - t.Errorf("take err:%v", err) - } - - db.Table("objects").Migrator().DropColumn(&Object4{}, "field3") - if err != nil { - t.Errorf("RenameColumn err:%v", err) - } - - err = db.Table("objects").Take(&Object4{}).Error - if err != nil { - t.Errorf("take err:%v", err) - } -} - func TestDifferentTypeWithoutDeclaredLength(t *testing.T) { type DiffType struct { ID uint