diff --git a/executor/executor.go b/executor/executor.go index 7804d3a3..13c746ac 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -8,6 +8,7 @@ import ( "context" "database/sql" + "xorm.io/builder" "xorm.io/xorm/v2" ) @@ -21,6 +22,30 @@ func New[T any](c xorm.Interface) *Executor[T] { } } +func (q *Executor[T]) Where(cond builder.Cond) *Executor[T] { + q.client.Where(cond) + return q +} + +func (q *Executor[T]) Get(ctx context.Context) (*T, error) { + var result T + if has, err := q.client.Get(&result); err != nil { + return nil, err + } else if !has { + return nil, nil + } + return &result, nil +} + +func (q *Executor[T]) InsertOne(ctx context.Context, obj *T) error { + _, err := q.client.InsertOne(obj) + return err +} + +func (q *Executor[T]) Insert(ctx context.Context, results []T) (int64, error) { + return q.client.Insert(results) +} + func (q *Executor[T]) Exec(ctx context.Context) (sql.Result, error) { return q.client.Exec() } diff --git a/executor/executor_test.go b/executor/executor_test.go index e0b83363..f18a4ee8 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -8,6 +8,7 @@ import ( "context" "testing" + "xorm.io/builder" "xorm.io/xorm/v2" _ "github.com/mattn/go-sqlite3" @@ -25,11 +26,23 @@ func TestExecutor(t *testing.T) { assert.NoError(t, engine.Sync(new(User))) // create querier - querier := New[User](engine) + executor := New[User](engine) - users, err := querier.All(context.Background()) - if err != nil { - t.Fatal(err) - } - assert.Equal(t, len(users), 0) + err = executor.InsertOne(context.Background(), &User{ + Name: "test", + }) + assert.NoError(t, err) + + user, err := executor.Get(context.Background()) + assert.NoError(t, err) + assert.Equal(t, user.Name, "test") + assert.Equal(t, user.Id, int64(1)) + + users, err := executor.All(context.Background()) + assert.NoError(t, err) + assert.Equal(t, len(users), 1) + + users, err = executor.Where(builder.Eq{"id": 1}).All(context.Background()) + assert.NoError(t, err) + assert.Equal(t, len(users), 1) }