From c896dddf826ab0dd0c29c4da298a2bc641a47fba Mon Sep 17 00:00:00 2001 From: hakanakyurek Date: Sat, 6 Dec 2025 14:01:19 +0100 Subject: [PATCH] fix: apply type model in generics row(s) --- generics.go | 6 +++-- tests/generics_test.go | 57 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/generics.go b/generics.go index 166d1520d..33e3ea26c 100644 --- a/generics.go +++ b/generics.go @@ -659,11 +659,13 @@ func (g execG[T]) FindInBatches(ctx context.Context, batchSize int, fc func(data } func (g execG[T]) Row(ctx context.Context) *sql.Row { - return g.g.apply(ctx).Row() + var r T + return g.g.apply(ctx).Model(r).Row() } func (g execG[T]) Rows(ctx context.Context) (*sql.Rows, error) { - return g.g.apply(ctx).Rows() + var r T + return g.g.apply(ctx).Model(r).Rows() } func (c chainG[T]) processSet(items ...clause.Assigner) setCreateOrUpdateG[T] { diff --git a/tests/generics_test.go b/tests/generics_test.go index ed260860b..2293be347 100644 --- a/tests/generics_test.go +++ b/tests/generics_test.go @@ -197,29 +197,70 @@ func TestGenericsRow(t *testing.T) { t.Fatalf("Create failed: %v", err) } - row := gorm.G[User](DB).Raw("SELECT name FROM ? WHERE id = ?", clause.Table{Name: clause.CurrentTable}, user.ID).Row(ctx) + rawSQLUserRow := gorm.G[User](DB).Raw("SELECT name FROM ? WHERE id = ?", clause.Table{Name: clause.CurrentTable}, user.ID).Row(ctx) var name string - if err := row.Scan(&name); err != nil { - t.Fatalf("Row scan failed: %v", err) + if err := rawSQLUserRow.Scan(&name); err != nil { + t.Fatalf("rawSQLUserRow scan failed: %v", err) } if name != user.Name { t.Errorf("expected %s, got %s", user.Name, name) } + var scannedUserName string + selectUserRow := gorm.G[User](DB).Select("name").Where("name = ?", user.Name).Row(ctx) + if err := selectUserRow.Scan(&scannedUserName); err != nil { + t.Fatalf("selectUserRow scan failed: %v", err) + } + if name != user.Name { + t.Errorf("expected %s, got %s", user.Name, scannedUserName) + } + user2 := User{Name: "GenericsRow2"} if err := gorm.G[User](DB).Create(ctx, &user2); err != nil { t.Fatalf("Create failed: %v", err) } - rows, err := gorm.G[User](DB).Raw("SELECT name FROM users WHERE id IN ?", []uint{user.ID, user2.ID}).Rows(ctx) + rawSQLUserRows, err := gorm.G[User](DB).Raw("SELECT name FROM users WHERE id IN ?", []uint{user.ID, user2.ID}).Rows(ctx) if err != nil { - t.Fatalf("Rows failed: %v", err) + t.Fatalf("rawSQLUserRows failed: %v", err) } count := 0 - for rows.Next() { + for rawSQLUserRows.Next() { var name string - if err := rows.Scan(&name); err != nil { - t.Fatalf("rows.Scan failed: %v", err) + if err := rawSQLUserRows.Scan(&name); err != nil { + t.Fatalf("rawSQLUserRows.Scan failed: %v", err) + } + count++ + } + if count != 2 { + t.Errorf("expected 2 rows, got %d", count) + } + + selectNameUserRows, err := gorm.G[User](DB).Select("name").Where("id IN ?", []uint{user.ID, user2.ID}).Rows(ctx) + if err != nil { + t.Fatalf("selectNameUserRows failed: %v", err) + } + count = 0 + for selectNameUserRows.Next() { + var name string + if err := selectNameUserRows.Scan(&name); err != nil { + t.Fatalf("selectNameUserRows.Scan failed: %v", err) + } + count++ + } + if count != 2 { + t.Errorf("expected 2 rows, got %d", count) + } + + fullUserRows, err := gorm.G[User](DB).Where("id IN ?", []uint{user.ID, user2.ID}).Rows(ctx) + if err != nil { + t.Fatalf("Rows failed: %v", err) + } + count = 0 + for fullUserRows.Next() { + var scannedUser User + if err := DB.ScanRows(fullUserRows, &scannedUser); err != nil { + t.Fatalf("DB.ScanRows failed: %v", err) } count++ }