model.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package model
  2. import (
  3. "context"
  4. "gorm.io/gorm"
  5. iContext "gxt-api-frame/app/context"
  6. "gxt-api-frame/app/schema"
  7. )
  8. // TransFunc 定义事务执行函数
  9. type TransFunc func(context.Context) error
  10. // ExecTrans 执行事务
  11. func ExecTrans(ctx context.Context, db *gorm.DB, fn TransFunc) error {
  12. if _, ok := iContext.FromTrans(ctx); ok {
  13. return fn(ctx)
  14. }
  15. transModel := NewTrans(db)
  16. trans, err := transModel.Begin(ctx)
  17. if err != nil {
  18. return err
  19. }
  20. defer func() {
  21. if r := recover(); r != nil {
  22. _ = transModel.Rollback(ctx, trans)
  23. panic(r)
  24. }
  25. }()
  26. ctx = iContext.NewTrans(ctx, trans)
  27. err = fn(ctx)
  28. if err != nil {
  29. _ = transModel.Rollback(ctx, trans)
  30. return err
  31. }
  32. return transModel.Commit(ctx, trans)
  33. }
  34. // ExecTransWithLock 执行事务(加锁)
  35. func ExecTransWithLock(ctx context.Context, db *gorm.DB, fn TransFunc) error {
  36. if !iContext.FromTransLock(ctx) {
  37. ctx = iContext.NewTransLock(ctx)
  38. }
  39. return ExecTrans(ctx, db, fn)
  40. }
  41. // WrapPageQuery 包装带有分页的查询
  42. func WrapPageQuery(ctx context.Context, db *gorm.DB, pp *schema.PaginationParam, out interface{}) (*schema.PaginationResult, error) {
  43. if pp != nil {
  44. total, err := FindPage(ctx, db, pp.PageIndex, pp.PageSize, out)
  45. if err != nil {
  46. return nil, err
  47. }
  48. return &schema.PaginationResult{
  49. Total: total,
  50. }, nil
  51. }
  52. result := db.Find(out)
  53. return nil, result.Error
  54. }
  55. // FindPage 查询分页数据
  56. func FindPage(ctx context.Context, db *gorm.DB, pageIndex, pageSize int, out interface{}) (int, error) {
  57. selectTmp := db.Statement.Clauses["SELECT"]
  58. var count int64
  59. result := db.Count(&count)
  60. db.Statement.Clauses["SELECT"] = selectTmp
  61. if err := result.Error; err != nil {
  62. return 0, err
  63. } else if count == 0 {
  64. return 0, nil
  65. }
  66. // 如果分页大小小于0或者分页索引小于0,则不查询数据
  67. if pageSize < 0 || pageIndex < 0 {
  68. return int(count), nil
  69. }
  70. if pageIndex > 0 && pageSize > 0 {
  71. db = db.Offset((pageIndex - 1) * pageSize)
  72. }
  73. if pageSize > 0 {
  74. db = db.Limit(pageSize)
  75. }
  76. result = db.Find(out)
  77. if err := result.Error; err != nil {
  78. return 0, err
  79. }
  80. return int(count), nil
  81. }
  82. // FindOne 查询单条数据
  83. func FindOne(ctx context.Context, db *gorm.DB, out interface{}) (bool, error) {
  84. result := db.First(out)
  85. if err := result.Error; err != nil {
  86. if err == gorm.ErrRecordNotFound {
  87. return false, nil
  88. }
  89. return false, err
  90. }
  91. return true, nil
  92. }
  93. // Check 检查数据是否存在
  94. func Check(ctx context.Context, db *gorm.DB) (bool, error) {
  95. var count int64
  96. result := db.Count(&count)
  97. if err := result.Error; err != nil {
  98. return false, err
  99. }
  100. return count > 0, nil
  101. }
  102. const maxNumberOfBatchParameters = 65535
  103. // OwnDb 实例化DB
  104. type OwnDb struct {
  105. *gorm.DB
  106. }