增删查改接口

定义

GoooQo提供接口DataAccess用于增删查改操作,提供接口TxDataAccess用于事务操作。

package core

type DataAccess[E Entity] interface {
	Get(ctx context.Context, id any) (*E, error)
	Delete(ctx context.Context, id any) (int64, error)
	Query(ctx context.Context, query Query) ([]E, error)
	Count(ctx context.Context, query Query) (int64, error)
	DeleteByQuery(ctx context.Context, query Query) (int64, error)
	Page(ctx context.Context, query Query) (PageList[E], error)
	Create(ctx context.Context, entity *E) (int64, error)
	CreateMulti(ctx context.Context, entities []E) (int64, error)
	Update(ctx context.Context, entity E) (int64, error)
	Patch(ctx context.Context, entity E) (int64, error)
	PatchByQuery(ctx context.Context, entity E, query Query) (int64, error)
}

type TxDataAccess[E Entity] interface {
	TransactionManager
	DataAccess[E]
}

创建事务管理器后,我们可以为每个实体创建一个TxDataAccess

userDataAccess := rdb.NewTxDataAccess[UserEntity](tm)

对于Entity的定义,请参考:

实体对象

对于Query的定义,请参考:

查询对象构建

示例

以下接口调用示例基于此查询对象:

type UserQuery struct {
    PageQuery
    ScoreLt  *int
    MemoNull *bool
    MemoLike *string
    Deleted  *bool
}

Get

user, err := userDataAccess.Get(ctx, 3)

Query

userQuery := UserQuery{ScoreLt: P(80)}
users, err := userDataAccess.Query(ctx, &userQuery)

Count

userQuery := UserQuery{ScoreLt: P(60)}
cnt, err := userDataAccess.Count(ctx, &userQuery)

Page

userQuery := UserQuery{
	PageQuery: PageQuery{PageSize: P(20)},
	ScoreLt:   P(80),
}
page, err := userDataAccess.Page(ctx, &userQuery)
// Executing SQL="SELECT id, score, memo FROM t_user WHERE score < ? LIMIT 20 OFFSET 0" args="[80]"
// Executing SQL="SELECT count(0) FROM t_user WHERE score < ?" args="[80]"

Delete

tc, _ := tm.StartTransaction(ctx)
cnt, err := userDataAccess.Delete(tc, 3)

DeleteByQuery

userQuery := UserQuery{ScoreLt: P(80)}
cnt, err := userDataAccess.DeleteByQuery(tc, userQuery)
// Executing SQL="DELETE FROM User WHERE score < ?" args="[80]"

Create

entity := UserEntity{Score: P(90), Memo: P("Great")}
id, err := userDataAccess.Create(tc, &entity)

CreateMulti

entities := []UserEntity{{Score: P(90), Memo: P("Great")}, {Score: P(55), Memo: P("Bad")}}
cnt, err := userDataAccess.CreateMulti(tc, entities)

Update

entity := UserEntity{Int64Id: NewInt64Id(2), Score: P(90), Memo: P("Great")}
cnt, err := userDataAccess.Update(tc, entity)
// Executing SQL="UPDATE t_user SET score = ?, memo = ? WHERE id = ?" args="[90 Great 2]"

Patch

entity := UserEntity{Int64Id: NewInt64Id(2), Score: P(90)}
cnt, err := userDataAccess.Patch(ctx, entity)
// Executing SQL="UPDATE t_user SET score = ? WHERE id = ?" args="[90 2]"

PatchByQuery

entity := UserEntity{Memo: P("Add Memo")}
query := UserQuery{MemoNull: P(true)}
cnt, err := userDataAccess.PatchByQuery(tc, entity, &query)
// Executing SQL="UPDATE t_user SET memo = ? WHERE memo IS NULL" args="[Add Memo]"

Last updated