db_orm.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package dbdata
  2. import (
  3. "errors"
  4. "reflect"
  5. "xorm.io/xorm"
  6. )
  7. const PageSize = 10
  8. var ErrNotFound = errors.New("ErrNotFound")
  9. func Add(data interface{}) error {
  10. _, err := xdb.InsertOne(data)
  11. return err
  12. }
  13. func AddBatch(data interface{}) error {
  14. _, err := xdb.Insert(data)
  15. return err
  16. }
  17. func Update(fieldName string, value interface{}, data interface{}) error {
  18. _, err := xdb.Where(fieldName+"=?", value).Update(data)
  19. return err
  20. }
  21. func Del(data interface{}) error {
  22. _, err := xdb.Delete(data)
  23. return err
  24. }
  25. func extract(data interface{}, fieldName string) interface{} {
  26. ref := reflect.ValueOf(data)
  27. r := &ref
  28. if r.Kind() == reflect.Ptr {
  29. e := r.Elem()
  30. r = &e
  31. }
  32. field := r.FieldByName(fieldName).Interface()
  33. return field
  34. }
  35. // 更新全部字段
  36. func Set(data interface{}) error {
  37. id := extract(data, "Id")
  38. _, err := xdb.ID(id).AllCols().Update(data)
  39. return err
  40. }
  41. func One(fieldName string, value interface{}, data interface{}) error {
  42. has, err := xdb.Where(fieldName+"=?", value).Get(data)
  43. if err != nil {
  44. return err
  45. }
  46. if !has {
  47. return ErrNotFound
  48. }
  49. return nil
  50. }
  51. func CountAll(data interface{}) int {
  52. n, _ := xdb.Count(data)
  53. return int(n)
  54. }
  55. func Find(data interface{}, limit, page int) error {
  56. if limit == 0 {
  57. return xdb.Find(data)
  58. }
  59. start := (page - 1) * limit
  60. return xdb.Limit(limit, start).Find(data)
  61. }
  62. func FindWhere(data interface{}, limit int, page int, where string, args ...interface{}) error {
  63. if limit == 0 {
  64. return xdb.Where(where, args...).Find(data)
  65. }
  66. start := (page - 1) * limit
  67. return xdb.Where(where, args...).Limit(limit, start).Find(data)
  68. }
  69. func CountPrefix(fieldName string, prefix string, data interface{}) int {
  70. n, _ := xdb.Where(fieldName+" like ?", prefix+"%").Count(data)
  71. return int(n)
  72. }
  73. func Prefix(fieldName string, prefix string, data interface{}, limit, page int) error {
  74. where := xdb.Where(fieldName+" like ?", prefix+"%")
  75. if limit == 0 {
  76. return where.Find(data)
  77. }
  78. start := (page - 1) * limit
  79. return where.Limit(limit, start).Find(data)
  80. }
  81. func FindAndCount(session *xorm.Session, data interface{}, limit, page int) (int64, error) {
  82. if limit == 0 {
  83. return session.FindAndCount(data)
  84. }
  85. start := (page - 1) * limit
  86. totalCount, err := session.Limit(limit, start).FindAndCount(data)
  87. return totalCount, err
  88. }