studentmodel.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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.RawFieldNames(&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. cacheStudentClassNamePrefix = "cache#student#class#name#"
  20. )
  21. type (
  22. // StudentModel only for test
  23. StudentModel interface {
  24. Insert(data Student) (sql.Result, error)
  25. FindOne(id int64) (*Student, error)
  26. FindOneByClassName(class string, name string) (*Student, error)
  27. Update(data Student) error
  28. // only for test
  29. Delete(id int64, className, studentName string) error
  30. }
  31. defaultStudentModel struct {
  32. sqlc.CachedConn
  33. table string
  34. }
  35. // Student only for test
  36. Student struct {
  37. Id int64 `db:"id"`
  38. Class string `db:"class"`
  39. Name string `db:"name"`
  40. Age sql.NullInt64 `db:"age"`
  41. Score sql.NullFloat64 `db:"score"`
  42. CreateTime time.Time `db:"create_time"`
  43. UpdateTime sql.NullTime `db:"update_time"`
  44. }
  45. )
  46. // NewStudentModel only for test
  47. func NewStudentModel(conn sqlx.SqlConn, c cache.CacheConf) StudentModel {
  48. return &defaultStudentModel{
  49. CachedConn: sqlc.NewConn(conn, c),
  50. table: "`student`",
  51. }
  52. }
  53. func (m *defaultStudentModel) Insert(data Student) (sql.Result, error) {
  54. studentClassNameKey := fmt.Sprintf("%s%v%v", cacheStudentClassNamePrefix, data.Class, data.Name)
  55. ret, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  56. query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?)", m.table, studentRowsExpectAutoSet)
  57. return conn.Exec(query, data.Class, data.Name, data.Age, data.Score)
  58. }, studentClassNameKey)
  59. return ret, err
  60. }
  61. func (m *defaultStudentModel) FindOne(id int64) (*Student, error) {
  62. studentIdKey := fmt.Sprintf("%s%v", cacheStudentIdPrefix, id)
  63. var resp Student
  64. err := m.QueryRow(&resp, studentIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  65. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", studentRows, m.table)
  66. return conn.QueryRow(v, query, id)
  67. })
  68. switch err {
  69. case nil:
  70. return &resp, nil
  71. case sqlc.ErrNotFound:
  72. return nil, ErrNotFound
  73. default:
  74. return nil, err
  75. }
  76. }
  77. func (m *defaultStudentModel) FindOneByClassName(class string, name string) (*Student, error) {
  78. studentClassNameKey := fmt.Sprintf("%s%v%v", cacheStudentClassNamePrefix, class, name)
  79. var resp Student
  80. err := m.QueryRowIndex(&resp, studentClassNameKey, m.formatPrimary, func(conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
  81. query := fmt.Sprintf("select %s from %s where `class` = ? and `name` = ? limit 1", studentRows, m.table)
  82. if err := conn.QueryRow(&resp, query, class, name); err != nil {
  83. return nil, err
  84. }
  85. return resp.Id, nil
  86. }, m.queryPrimary)
  87. switch err {
  88. case nil:
  89. return &resp, nil
  90. case sqlc.ErrNotFound:
  91. return nil, ErrNotFound
  92. default:
  93. return nil, err
  94. }
  95. }
  96. func (m *defaultStudentModel) Update(data Student) error {
  97. studentIdKey := fmt.Sprintf("%s%v", cacheStudentIdPrefix, data.Id)
  98. _, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  99. query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, studentRowsWithPlaceHolder)
  100. return conn.Exec(query, data.Class, data.Name, data.Age, data.Score, data.Id)
  101. }, studentIdKey)
  102. return err
  103. }
  104. func (m *defaultStudentModel) Delete(id int64, className, studentName string) error {
  105. studentIdKey := fmt.Sprintf("%s%v", cacheStudentIdPrefix, id)
  106. studentClassNameKey := fmt.Sprintf("%s%v%v", cacheStudentClassNamePrefix, className, studentName)
  107. _, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  108. query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
  109. return conn.Exec(query, id)
  110. }, studentIdKey, studentClassNameKey)
  111. return err
  112. }
  113. func (m *defaultStudentModel) formatPrimary(primary interface{}) string {
  114. return fmt.Sprintf("%s%v", cacheStudentIdPrefix, primary)
  115. }
  116. func (m *defaultStudentModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
  117. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", studentRows, m.table)
  118. return conn.QueryRow(v, query, primary)
  119. }