Skip to content

Commit eabca1f

Browse files
committed
Allow Select/Omit for Generics Create, close #7638, #7633
1 parent a57abbe commit eabca1f

File tree

3 files changed

+48
-6
lines changed

3 files changed

+48
-6
lines changed

generics.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ type Interface[T any] interface {
3939

4040
type CreateInterface[T any] interface {
4141
ExecInterface[T]
42-
// chain methods available at start; return ChainInterface
42+
// chain methods available at start; Select/Omit keep CreateInterface to allow Create chaining
4343
Scopes(scopes ...func(db *Statement)) ChainInterface[T]
4444
Where(query interface{}, args ...interface{}) ChainInterface[T]
4545
Not(query interface{}, args ...interface{}) ChainInterface[T]
@@ -48,8 +48,8 @@ type CreateInterface[T any] interface {
4848
Offset(offset int) ChainInterface[T]
4949
Joins(query clause.JoinTarget, on func(db JoinBuilder, joinTable clause.Table, curTable clause.Table) error) ChainInterface[T]
5050
Preload(association string, query func(db PreloadBuilder) error) ChainInterface[T]
51-
Select(query string, args ...interface{}) ChainInterface[T]
52-
Omit(columns ...string) ChainInterface[T]
51+
Select(query string, args ...interface{}) CreateInterface[T]
52+
Omit(columns ...string) CreateInterface[T]
5353
MapColumns(m map[string]string) ChainInterface[T]
5454
Distinct(args ...interface{}) ChainInterface[T]
5555
Group(name string) ChainInterface[T]
@@ -203,6 +203,18 @@ func (c createG[T]) Table(name string, args ...interface{}) CreateInterface[T] {
203203
})}
204204
}
205205

206+
func (c createG[T]) Select(query string, args ...interface{}) CreateInterface[T] {
207+
return createG[T]{c.with(func(db *DB) *DB {
208+
return db.Select(query, args...)
209+
})}
210+
}
211+
212+
func (c createG[T]) Omit(columns ...string) CreateInterface[T] {
213+
return createG[T]{c.with(func(db *DB) *DB {
214+
return db.Omit(columns...)
215+
})}
216+
}
217+
206218
func (c createG[T]) Set(assignments ...clause.Assigner) SetCreateOrUpdateInterface[T] {
207219
return c.processSet(assignments...)
208220
}

tests/generics_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,36 @@ func TestGenericsCreate(t *testing.T) {
6969
if v := mapResult["user_name"]; fmt.Sprint(v) != user.Name {
7070
t.Errorf("failed to find map results, got %v, err %v", mapResult, err)
7171
}
72+
73+
selectOnly := User{Name: "GenericsCreateSelectOnly", Age: 99}
74+
if err := gorm.G[User](DB).Select("name").Create(ctx, &selectOnly); err != nil {
75+
t.Fatalf("failed to create with Select, got error: %v", err)
76+
}
77+
78+
if selectOnly.ID == 0 {
79+
t.Fatalf("no primary key found for select-only user: %v", selectOnly)
80+
}
81+
82+
if stored, err := gorm.G[User](DB).Where("id = ?", selectOnly.ID).First(ctx); err != nil {
83+
t.Fatalf("failed to reload select-only user, got error: %v", err)
84+
} else if stored.Name != selectOnly.Name || stored.Age != 0 {
85+
t.Errorf("unexpected select-only user state, got %#v", stored)
86+
}
87+
88+
omitAge := User{Name: "GenericsCreateOmitAge", Age: 88}
89+
if err := gorm.G[User](DB).Omit("age").Create(ctx, &omitAge); err != nil {
90+
t.Fatalf("failed to create with Omit, got error: %v", err)
91+
}
92+
93+
if omitAge.ID == 0 {
94+
t.Fatalf("no primary key found for omit-age user: %v", omitAge)
95+
}
96+
97+
if stored, err := gorm.G[User](DB).Where("id = ?", omitAge.ID).First(ctx); err != nil {
98+
t.Fatalf("failed to reload omit-age user, got error: %v", err)
99+
} else if stored.Name != omitAge.Name || stored.Age != 0 {
100+
t.Errorf("unexpected omit-age user state, got %#v", stored)
101+
}
72102
}
73103

74104
func TestGenericsCreateInBatches(t *testing.T) {

tests/go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ require (
1212
gorm.io/driver/postgres v1.6.0
1313
gorm.io/driver/sqlite v1.6.0
1414
gorm.io/driver/sqlserver v1.6.1
15-
gorm.io/gorm v1.30.5
15+
gorm.io/gorm v1.31.0
1616
)
1717

1818
require (
@@ -31,9 +31,9 @@ require (
3131
github.com/microsoft/go-mssqldb v1.9.3 // indirect
3232
github.com/pmezard/go-difflib v1.0.0 // indirect
3333
github.com/tjfoc/gmsm v1.4.1 // indirect
34-
golang.org/x/crypto v0.42.0 // indirect
34+
golang.org/x/crypto v0.43.0 // indirect
3535
golang.org/x/sync v0.17.0 // indirect
36-
golang.org/x/text v0.29.0 // indirect
36+
golang.org/x/text v0.30.0 // indirect
3737
gopkg.in/yaml.v3 v3.0.1 // indirect
3838
)
3939

0 commit comments

Comments
 (0)