studentmodel.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package model
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "strings"
  6. "time"
  7. "github.com/tal-tech/go-zero/core/stores/cache"
  8. "github.com/tal-tech/go-zero/core/stores/sqlc"
  9. "github.com/tal-tech/go-zero/core/stores/sqlx"
  10. "github.com/tal-tech/go-zero/core/stringx"
  11. "github.com/tal-tech/go-zero/tools/goctl/model/sql/builderx"
  12. )
  13. var (
  14. studentFieldNames = builderx.FieldNames(&Student{})
  15. studentRows = strings.Join(studentFieldNames, ",")
  16. studentRowsExpectAutoSet = strings.Join(stringx.Remove(studentFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
  17. studentRowsWithPlaceHolder = strings.Join(stringx.Remove(studentFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
  18. cacheStudentIdPrefix = "cache#Student#id#"
  19. )
  20. type (
  21. StudentModel interface {
  22. Insert(data Student) (sql.Result, error)
  23. FindOne(id int64) (*Student, error)
  24. Update(data Student) error
  25. Delete(id int64) error
  26. }
  27. defaultStudentModel struct {
  28. sqlc.CachedConn
  29. table string
  30. }
  31. Student struct {
  32. Id int64 `db:"id"`
  33. Name string `db:"name"`
  34. Age sql.NullInt64 `db:"age"`
  35. Score sql.NullFloat64 `db:"score"`
  36. CreateTime time.Time `db:"create_time"`
  37. UpdateTime sql.NullTime `db:"update_time"`
  38. }
  39. )
  40. func NewStudentModel(conn sqlx.SqlConn, c cache.CacheConf) StudentModel {
  41. return &defaultStudentModel{
  42. CachedConn: sqlc.NewConn(conn, c),
  43. table: "`student`",
  44. }
  45. }
  46. func (m *defaultStudentModel) Insert(data Student) (sql.Result, error) {
  47. query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?)", m.table, studentRowsExpectAutoSet)
  48. ret, err := m.ExecNoCache(query, data.Name, data.Age, data.Score)
  49. return ret, err
  50. }
  51. func (m *defaultStudentModel) FindOne(id int64) (*Student, error) {
  52. studentIdKey := fmt.Sprintf("%s%v", cacheStudentIdPrefix, id)
  53. var resp Student
  54. err := m.QueryRow(&resp, studentIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  55. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", studentRows, m.table)
  56. return conn.QueryRow(v, query, id)
  57. })
  58. switch err {
  59. case nil:
  60. return &resp, nil
  61. case sqlc.ErrNotFound:
  62. return nil, ErrNotFound
  63. default:
  64. return nil, err
  65. }
  66. }
  67. func (m *defaultStudentModel) Update(data Student) error {
  68. studentIdKey := fmt.Sprintf("%s%v", cacheStudentIdPrefix, data.Id)
  69. _, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  70. query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, studentRowsWithPlaceHolder)
  71. return conn.Exec(query, data.Name, data.Age, data.Score, data.Id)
  72. }, studentIdKey)
  73. return err
  74. }
  75. func (m *defaultStudentModel) Delete(id int64) error {
  76. studentIdKey := fmt.Sprintf("%s%v", cacheStudentIdPrefix, id)
  77. _, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  78. query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
  79. return conn.Exec(query, id)
  80. }, studentIdKey)
  81. return err
  82. }
  83. func (m *defaultStudentModel) formatPrimary(primary interface{}) string {
  84. return fmt.Sprintf("%s%v", cacheStudentIdPrefix, primary)
  85. }
  86. func (m *defaultStudentModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
  87. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", studentRows, m.table)
  88. return conn.QueryRow(v, query, primary)
  89. }