Skip to content

Commit 3840425

Browse files
committed
fix(generics): resolve CurrentTable in Raw/Exec
1 parent cace4a6 commit 3840425

File tree

4 files changed

+15
-6
lines changed

4 files changed

+15
-6
lines changed

generics.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,15 @@ func (c *g[T]) Raw(sql string, values ...interface{}) ExecInterface[T] {
142142
return execG[T]{g: &g[T]{
143143
db: c.db,
144144
ops: append(c.ops, func(db *DB) *DB {
145-
return db.Raw(sql, values...)
145+
var r T
146+
return db.Model(r).Raw(sql, values...)
146147
}),
147148
}}
148149
}
149150

150151
func (c *g[T]) Exec(ctx context.Context, sql string, values ...interface{}) error {
151-
return c.apply(ctx).Exec(sql, values...).Error
152+
var r T
153+
return c.apply(ctx).Model(r).Exec(sql, values...).Error
152154
}
153155

154156
type createG[T any] struct {

statement.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ func (stmt *Statement) QuoteTo(writer clause.Writer, field interface{}) {
9696
if v.Name == clause.CurrentTable {
9797
if stmt.TableExpr != nil {
9898
stmt.TableExpr.Build(stmt)
99-
} else {
99+
} else if stmt.Table != "" {
100+
write(v.Raw, stmt.Table)
101+
} else if stmt.AddError(stmt.Parse(stmt.Model)) == nil {
100102
write(v.Raw, stmt.Table)
101103
}
102104
} else {

tests/generics_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ func TestGenericsExecAndUpdate(t *testing.T) {
121121
t.Fatalf("Exec insert failed: %v", err)
122122
}
123123

124+
name2 := "GenericsExec2"
125+
if err := gorm.G[User](DB).Exec(ctx, "INSERT INTO ?(name) VALUES(?)", clause.Table{Name: clause.CurrentTable}, name2); err != nil {
126+
t.Fatalf("Exec insert failed: %v", err)
127+
}
128+
124129
u, err := gorm.G[User](DB).Table("users as u").Where("u.name = ?", name).First(ctx)
125130
if err != nil {
126131
t.Fatalf("failed to find user, got error: %v", err)
@@ -162,7 +167,7 @@ func TestGenericsRow(t *testing.T) {
162167
t.Fatalf("Create failed: %v", err)
163168
}
164169

165-
row := gorm.G[User](DB).Raw("SELECT name FROM users WHERE id = ?", user.ID).Row(ctx)
170+
row := gorm.G[User](DB).Raw("SELECT name FROM ? WHERE id = ?", clause.Table{Name: clause.CurrentTable}, user.ID).Row(ctx)
166171
var name string
167172
if err := row.Scan(&name); err != nil {
168173
t.Fatalf("Row scan failed: %v", err)

tests/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ require (
66
github.com/google/uuid v1.6.0
77
github.com/jinzhu/now v1.1.5
88
github.com/lib/pq v1.10.9
9-
github.com/stretchr/testify v1.11.0
9+
github.com/stretchr/testify v1.11.1
1010
gorm.io/driver/gaussdb v0.1.0
1111
gorm.io/driver/mysql v1.6.0
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.0
15+
gorm.io/gorm v1.30.2
1616
)
1717

1818
require (

0 commit comments

Comments
 (0)