session_sum.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. // Copyright 2016 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import "database/sql"
  6. // Count counts the records. bean's non-empty fields
  7. // are conditions.
  8. func (session *Session) Count(bean ...interface{}) (int64, error) {
  9. defer session.resetStatement()
  10. if session.IsAutoClose {
  11. defer session.Close()
  12. }
  13. var sqlStr string
  14. var args []interface{}
  15. var err error
  16. if session.Statement.RawSQL == "" {
  17. if len(bean) == 0 {
  18. return 0, ErrTableNotFound
  19. }
  20. sqlStr, args, err = session.Statement.genCountSQL(bean[0])
  21. if err != nil {
  22. return 0, err
  23. }
  24. } else {
  25. sqlStr = session.Statement.RawSQL
  26. args = session.Statement.RawParams
  27. }
  28. session.queryPreprocess(&sqlStr, args...)
  29. var total int64
  30. if session.IsAutoCommit {
  31. err = session.DB().QueryRow(sqlStr, args...).Scan(&total)
  32. } else {
  33. err = session.Tx.QueryRow(sqlStr, args...).Scan(&total)
  34. }
  35. if err == sql.ErrNoRows || err == nil {
  36. return total, nil
  37. }
  38. return 0, err
  39. }
  40. // Sum call sum some column. bean's non-empty fields are conditions.
  41. func (session *Session) Sum(bean interface{}, columnName string) (float64, error) {
  42. defer session.resetStatement()
  43. if session.IsAutoClose {
  44. defer session.Close()
  45. }
  46. var sqlStr string
  47. var args []interface{}
  48. var err error
  49. if len(session.Statement.RawSQL) == 0 {
  50. sqlStr, args, err = session.Statement.genSumSQL(bean, columnName)
  51. if err != nil {
  52. return 0, err
  53. }
  54. } else {
  55. sqlStr = session.Statement.RawSQL
  56. args = session.Statement.RawParams
  57. }
  58. session.queryPreprocess(&sqlStr, args...)
  59. var res float64
  60. if session.IsAutoCommit {
  61. err = session.DB().QueryRow(sqlStr, args...).Scan(&res)
  62. } else {
  63. err = session.Tx.QueryRow(sqlStr, args...).Scan(&res)
  64. }
  65. if err == sql.ErrNoRows || err == nil {
  66. return res, nil
  67. }
  68. return 0, err
  69. }
  70. // SumInt call sum some column. bean's non-empty fields are conditions.
  71. func (session *Session) SumInt(bean interface{}, columnName string) (int64, error) {
  72. defer session.resetStatement()
  73. if session.IsAutoClose {
  74. defer session.Close()
  75. }
  76. var sqlStr string
  77. var args []interface{}
  78. var err error
  79. if len(session.Statement.RawSQL) == 0 {
  80. sqlStr, args, err = session.Statement.genSumSQL(bean, columnName)
  81. if err != nil {
  82. return 0, err
  83. }
  84. } else {
  85. sqlStr = session.Statement.RawSQL
  86. args = session.Statement.RawParams
  87. }
  88. session.queryPreprocess(&sqlStr, args...)
  89. var res int64
  90. if session.IsAutoCommit {
  91. err = session.DB().QueryRow(sqlStr, args...).Scan(&res)
  92. } else {
  93. err = session.Tx.QueryRow(sqlStr, args...).Scan(&res)
  94. }
  95. if err == sql.ErrNoRows || err == nil {
  96. return res, nil
  97. }
  98. return 0, err
  99. }
  100. // Sums call sum some columns. bean's non-empty fields are conditions.
  101. func (session *Session) Sums(bean interface{}, columnNames ...string) ([]float64, error) {
  102. defer session.resetStatement()
  103. if session.IsAutoClose {
  104. defer session.Close()
  105. }
  106. var sqlStr string
  107. var args []interface{}
  108. var err error
  109. if len(session.Statement.RawSQL) == 0 {
  110. sqlStr, args, err = session.Statement.genSumSQL(bean, columnNames...)
  111. if err != nil {
  112. return nil, err
  113. }
  114. } else {
  115. sqlStr = session.Statement.RawSQL
  116. args = session.Statement.RawParams
  117. }
  118. session.queryPreprocess(&sqlStr, args...)
  119. var res = make([]float64, len(columnNames), len(columnNames))
  120. if session.IsAutoCommit {
  121. err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res)
  122. } else {
  123. err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res)
  124. }
  125. if err == sql.ErrNoRows || err == nil {
  126. return res, nil
  127. }
  128. return nil, err
  129. }
  130. // SumsInt sum specify columns and return as []int64 instead of []float64
  131. func (session *Session) SumsInt(bean interface{}, columnNames ...string) ([]int64, error) {
  132. defer session.resetStatement()
  133. if session.IsAutoClose {
  134. defer session.Close()
  135. }
  136. var sqlStr string
  137. var args []interface{}
  138. var err error
  139. if len(session.Statement.RawSQL) == 0 {
  140. sqlStr, args, err = session.Statement.genSumSQL(bean, columnNames...)
  141. if err != nil {
  142. return nil, err
  143. }
  144. } else {
  145. sqlStr = session.Statement.RawSQL
  146. args = session.Statement.RawParams
  147. }
  148. session.queryPreprocess(&sqlStr, args...)
  149. var res = make([]int64, len(columnNames), len(columnNames))
  150. if session.IsAutoCommit {
  151. err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res)
  152. } else {
  153. err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res)
  154. }
  155. if err == sql.ErrNoRows || err == nil {
  156. return res, nil
  157. }
  158. return nil, err
  159. }