initial import
This commit is contained in:
142
example/sqlc/user.go
Normal file
142
example/sqlc/user.go
Normal file
@@ -0,0 +1,142 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
"zero/core/stores/cache"
|
||||
"zero/core/stores/sqlc"
|
||||
"zero/core/stores/sqlx"
|
||||
"zero/kq"
|
||||
)
|
||||
|
||||
var (
|
||||
userRows = "id, mobile, name, sex"
|
||||
|
||||
cacheUserMobilePrefix = "cache#user#mobile#"
|
||||
cacheUserIdPrefix = "cache#user#id#"
|
||||
|
||||
ErrNotFound = sqlc.ErrNotFound
|
||||
)
|
||||
|
||||
type (
|
||||
User struct {
|
||||
Id int64 `db:"id" json:"id,omitempty"`
|
||||
Mobile string `db:"mobile" json:"mobile,omitempty"`
|
||||
Name string `db:"name" json:"name,omitempty"`
|
||||
Sex int `db:"sex" json:"sex,omitempty"`
|
||||
}
|
||||
|
||||
UserModel struct {
|
||||
sqlc.CachedConn
|
||||
// sqlx.SqlConn
|
||||
table string
|
||||
|
||||
// kafka use kq not kmq
|
||||
push *kq.Pusher
|
||||
}
|
||||
)
|
||||
|
||||
func NewUserModel(db sqlx.SqlConn, c cache.CacheConf, table string, pusher *kq.Pusher) *UserModel {
|
||||
return &UserModel{
|
||||
CachedConn: sqlc.NewConn(db, c),
|
||||
table: table,
|
||||
push: pusher,
|
||||
}
|
||||
}
|
||||
|
||||
func (um *UserModel) FindOne(id int64) (*User, error) {
|
||||
key := fmt.Sprintf("%s%d", cacheUserIdPrefix, id)
|
||||
var user User
|
||||
err := um.QueryRow(&user, key, func(conn sqlx.SqlConn, v interface{}) error {
|
||||
query := fmt.Sprintf("SELECT %s FROM user WHERE id=?", userRows)
|
||||
return conn.QueryRow(v, query, id)
|
||||
})
|
||||
switch err {
|
||||
case nil:
|
||||
return &user, nil
|
||||
case sqlc.ErrNotFound:
|
||||
return nil, ErrNotFound
|
||||
default:
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
func (um *UserModel) FindByMobile(mobile string) (*User, error) {
|
||||
var user User
|
||||
key := fmt.Sprintf("%s%s", cacheUserMobilePrefix, mobile)
|
||||
err := um.QueryRowIndex(&user, key, func(primary interface{}) string {
|
||||
return fmt.Sprintf("%s%d", cacheUserIdPrefix, primary.(int64))
|
||||
}, func(conn sqlx.SqlConn, v interface{}) (interface{}, error) {
|
||||
query := fmt.Sprintf("SELECT %s FROM user WHERE mobile=?", userRows)
|
||||
if err := conn.QueryRow(&user, query, mobile); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return user.Id, nil
|
||||
}, func(conn sqlx.SqlConn, v interface{}, primary interface{}) error {
|
||||
return conn.QueryRow(v, "SELECT * FROM user WHERE id=?", primary)
|
||||
})
|
||||
switch err {
|
||||
case nil:
|
||||
return &user, nil
|
||||
case sqlc.ErrNotFound:
|
||||
return nil, ErrNotFound
|
||||
default:
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// Count for no cache
|
||||
func (um *UserModel) Count() (int64, error) {
|
||||
var count int64
|
||||
err := um.QueryRowNoCache(&count, "SELECT count(1) FROM user")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
|
||||
// Query rows
|
||||
func (um *UserModel) FindByName(name string) ([]*User, error) {
|
||||
var users []*User
|
||||
query := fmt.Sprintf("SELECT %s FROM user WHERE name=?", userRows)
|
||||
err := um.QueryRowsNoCache(&userRows, query, name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return users, nil
|
||||
}
|
||||
|
||||
func (um *UserModel) UpdateSexById(sex int, id int64) error {
|
||||
key := fmt.Sprintf("%s%d", cacheUserIdPrefix, id)
|
||||
_, err := um.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
|
||||
query := fmt.Sprintf("UPDATE user SET sex=? WHERE id=?")
|
||||
return conn.Exec(query, sex, id)
|
||||
}, key)
|
||||
return err
|
||||
}
|
||||
|
||||
func (um *UserModel) UpdateMobileById(mobile string, id int64) error {
|
||||
idKey := fmt.Sprintf("%s%d", cacheUserIdPrefix, id)
|
||||
mobileKey := fmt.Sprintf("%s%s", cacheUserMobilePrefix, mobile)
|
||||
_, err := um.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
|
||||
query := fmt.Sprintf("UPDATE user SET mobile=? WHERE id=?")
|
||||
return conn.Exec(query, mobile, id)
|
||||
}, idKey, mobileKey)
|
||||
return err
|
||||
}
|
||||
|
||||
func (um *UserModel) Update(u *User) error {
|
||||
oldUser, err := um.FindOne(u.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
idKey := fmt.Sprintf("%s%d", cacheUserIdPrefix, oldUser.Id)
|
||||
mobileKey := fmt.Sprintf("%s%s", cacheUserMobilePrefix, oldUser.Mobile)
|
||||
_, err = um.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
|
||||
query := fmt.Sprintf("UPDATE user SET mobile=?, name=?, sex=? WHERE id=?")
|
||||
return conn.Exec(query, u.Mobile, u.Name, u.Sex, u.Id)
|
||||
}, idKey, mobileKey)
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user