package model import ( "context" "database/sql" "errors" "fmt" "github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/sqlx" ) var _ UsersModel = (*customUsersModel)(nil) type ( // UsersModel is an interface to be customized, add more methods here, // and implement the added methods in customUsersModel. UsersModel interface { usersModel UpdateUserTrans(ctx context.Context, user *Users, session sqlx.Session) (sql.Result, error) FindOneTrans(ctx context.Context, userId int64, session sqlx.Session) (*Users, error) } customUsersModel struct { *defaultUsersModel } ) // NewUsersModel returns a model for the database table. func NewUsersModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) UsersModel { return &customUsersModel{ defaultUsersModel: newUsersModel(conn, c, opts...), } } func (m *defaultUsersModel) UpdateUserTrans(ctx context.Context, user *Users, session sqlx.Session) (sql.Result, error) { userIdKey := fmt.Sprintf("%s%v", cacheUsersIdPrefix, user.Id) usersPhoneKey := fmt.Sprintf("%s%v", cacheUsersPhonePrefix, user.Phone) usersUsernameKey := fmt.Sprintf("%s%v", cacheUsersUsernamePrefix, user.Username) query := fmt.Sprintf("UPDATE %s SET %s WHERE `id` = ?", m.table, usersRowsWithPlaceHolder) ret, err := session.ExecCtx(ctx, query, user.Username, user.Password, user.Phone, user.AuthStatus, user.Id) if err != nil { return nil, err } // 2. 删除缓存,保证所有缓存操作成功 cacheKeys := []string{userIdKey, usersPhoneKey, usersUsernameKey} cacheErrors := make([]error, len(cacheKeys)) cacheErrors[0] = m.DelCacheCtx(ctx, userIdKey) cacheErrors[1] = m.DelCacheCtx(ctx, usersPhoneKey) cacheErrors[2] = m.DelCacheCtx(ctx, usersUsernameKey) // 3. 检查缓存操作是否全部成功 for _, cacheErr := range cacheErrors { if cacheErr != nil { return nil, cacheErr // 返回第一个缓存更新失败的错误 } } return ret, err } func (m *defaultUsersModel) FindOneTrans(ctx context.Context, userId int64, session sqlx.Session) (*Users, error) { // 定义 SQL 查询语句 query := fmt.Sprintf("SELECT %s FROM %s WHERE `id` = ? LIMIT 1", usersRows, m.table) var user Users // 在事务上下文中执行查询 err := session.QueryRowCtx(ctx, &user, query, userId) if err != nil { if errors.Is(err, sql.ErrNoRows) { // 如果没有找到记录,返回 nil 和 ErrNotFound 错误 return nil, ErrNotFound } return nil, err } // 返回查询结果 return &user, nil }