Fix Generics Scan, close https://github.com/go-gorm/playground/pull/803
This commit is contained in:
parent
c44405a25b
commit
49b01a3e93
@ -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
|
||||
}
|
||||
|
||||
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
12
tests/go.mod
12
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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user