handle error of generics Joins/Preload
This commit is contained in:
parent
4694673526
commit
e330694e26
26
generics.go
26
generics.go
@ -31,8 +31,8 @@ type ChainInterface[T any] interface {
|
|||||||
Or(query interface{}, args ...interface{}) ChainInterface[T]
|
Or(query interface{}, args ...interface{}) ChainInterface[T]
|
||||||
Limit(offset int) ChainInterface[T]
|
Limit(offset int) ChainInterface[T]
|
||||||
Offset(offset int) ChainInterface[T]
|
Offset(offset int) ChainInterface[T]
|
||||||
Joins(query clause.JoinTarget, args func(db JoinBuilder, joinTable clause.Table, curTable clause.Table) error) ChainInterface[T]
|
Joins(query clause.JoinTarget, on func(db JoinBuilder, joinTable clause.Table, curTable clause.Table) error) ChainInterface[T]
|
||||||
Preload(association string, args func(db PreloadBuilder) error) ChainInterface[T]
|
Preload(association string, query func(db PreloadBuilder) error) ChainInterface[T]
|
||||||
Select(query string, args ...interface{}) ChainInterface[T]
|
Select(query string, args ...interface{}) ChainInterface[T]
|
||||||
Omit(columns ...string) ChainInterface[T]
|
Omit(columns ...string) ChainInterface[T]
|
||||||
MapColumns(m map[string]string) ChainInterface[T]
|
MapColumns(m map[string]string) ChainInterface[T]
|
||||||
@ -287,15 +287,17 @@ func (q preloadBuilder) Scopes(scopes ...func(db *Statement)) PreloadBuilder {
|
|||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c chainG[T]) Joins(jt clause.JoinTarget, args func(db JoinBuilder, joinTable clause.Table, curTable clause.Table) error) ChainInterface[T] {
|
func (c chainG[T]) Joins(jt clause.JoinTarget, on func(db JoinBuilder, joinTable clause.Table, curTable clause.Table) error) ChainInterface[T] {
|
||||||
return c.with(func(db *DB) *DB {
|
return c.with(func(db *DB) *DB {
|
||||||
if jt.Table == "" {
|
if jt.Table == "" {
|
||||||
jt.Table = clause.JoinTable(strings.Split(jt.Association, ".")...).Name
|
jt.Table = clause.JoinTable(strings.Split(jt.Association, ".")...).Name
|
||||||
}
|
}
|
||||||
|
|
||||||
q := joinBuilder{db: db.Session(&Session{NewDB: true}).getInstance().Table(jt.Table)}
|
q := joinBuilder{db: db.Session(&Session{NewDB: true, Initialized: true}).Table(jt.Table)}
|
||||||
if args != nil {
|
if on != nil {
|
||||||
args(q, clause.Table{Name: jt.Table}, clause.Table{Name: clause.CurrentTable})
|
if err := on(q, clause.Table{Name: jt.Table}, clause.Table{Name: clause.CurrentTable}); err != nil {
|
||||||
|
db.AddError(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
j := join{
|
j := join{
|
||||||
@ -383,12 +385,14 @@ func (c chainG[T]) Order(value interface{}) ChainInterface[T] {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c chainG[T]) Preload(association string, args func(db PreloadBuilder) error) ChainInterface[T] {
|
func (c chainG[T]) Preload(association string, query func(db PreloadBuilder) error) ChainInterface[T] {
|
||||||
return c.with(func(db *DB) *DB {
|
return c.with(func(db *DB) *DB {
|
||||||
return db.Preload(association, func(db *DB) *DB {
|
return db.Preload(association, func(tx *DB) *DB {
|
||||||
q := preloadBuilder{db: db}
|
q := preloadBuilder{db: tx}
|
||||||
if args != nil {
|
if query != nil {
|
||||||
args(q)
|
if err := query(q); err != nil {
|
||||||
|
db.AddError(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return q.db
|
return q.db
|
||||||
})
|
})
|
||||||
|
@ -2,6 +2,7 @@ package tests_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
@ -367,6 +368,13 @@ func TestGenericsJoinsAndPreload(t *testing.T) {
|
|||||||
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
|
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err = db.Joins(clause.Has("Company"), func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
|
||||||
|
return errors.New("join error")
|
||||||
|
}).First(ctx)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("Joins should got error, but got nil")
|
||||||
|
}
|
||||||
|
|
||||||
// Preload
|
// Preload
|
||||||
result3, err := db.Preload("Company", nil).Where("name = ?", u.Name).First(ctx)
|
result3, err := db.Preload("Company", nil).Where("name = ?", u.Name).First(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -392,6 +400,13 @@ func TestGenericsJoinsAndPreload(t *testing.T) {
|
|||||||
t.Fatalf("Preload other company should not loaded, user %v company expect %v but got %+v", u.Name, u.Company.Name, result.Company.Name)
|
t.Fatalf("Preload other company should not loaded, user %v company expect %v but got %+v", u.Name, u.Company.Name, result.Company.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err = db.Preload("Company", func(db gorm.PreloadBuilder) error {
|
||||||
|
return errors.New("preload error")
|
||||||
|
}).Find(ctx)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("Preload should failed, but got nil")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGenericsDistinct(t *testing.T) {
|
func TestGenericsDistinct(t *testing.T) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user