crud.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package db
  2. import "fmt"
  3. func (db DB) Insert(obj interface{}) error {
  4. tx := db.orm.Begin()
  5. err := tx.Create(obj).Error
  6. if err != nil {
  7. tx.Rollback()
  8. return err
  9. }
  10. err = tx.Commit().Error
  11. if err != nil {
  12. tx.Rollback()
  13. return err
  14. }
  15. return nil
  16. }
  17. func (db DB) Get(objs interface{}, where map[string]interface{}, order string, limit uint64, offset uint64, deleted bool) error {
  18. con := db.orm
  19. if deleted {
  20. con = con.Unscoped()
  21. }
  22. keys, values := whereExactKeyValues(where)
  23. con = con.Where(keys, values)
  24. if deleted {
  25. con = con.Where("deleted_at is not null")
  26. }
  27. if order != "" {
  28. con = con.Order(order)
  29. }
  30. if limit != 0 {
  31. con = con.Limit(limit)
  32. }
  33. if offset != 0 {
  34. con = con.Offset(offset)
  35. }
  36. err := con.Find(objs).Error
  37. if err != nil {
  38. return err
  39. }
  40. return nil
  41. }
  42. // get by id
  43. func (db DB) GetById(obj interface{}, id uint64) error {
  44. err := db.orm.First(obj, id).Error
  45. if err != nil {
  46. return err
  47. }
  48. return nil
  49. }
  50. func (db DB) Update(obj interface{}, para map[string]interface{}) error {
  51. tx := db.orm.Begin()
  52. err := tx.Model(obj).Updates(para).Error
  53. if err != nil {
  54. tx.Rollback()
  55. return err
  56. }
  57. err = tx.Commit().Error
  58. if err != nil {
  59. tx.Rollback()
  60. return err
  61. }
  62. return nil
  63. }
  64. func (db DB) Delete(obj interface{}, para map[string]interface{}) error {
  65. tx := db.orm.Begin()
  66. err := tx.Where(para).Delete(obj).Error
  67. if err != nil {
  68. tx.Rollback()
  69. return err
  70. }
  71. err = tx.Commit().Error
  72. if err != nil {
  73. tx.Rollback()
  74. return err
  75. }
  76. return nil
  77. }
  78. // get tables
  79. func (db DB) GetTables() ([]interface{}, error) {
  80. var tables []interface{}
  81. if db.driver == SQLITE_DRIVER {
  82. ts, err := db.sqliteTables()
  83. if err != nil {
  84. return ts, err
  85. }
  86. tables = ts
  87. }
  88. if db.driver == POSTGRES_DRIVER {
  89. tp, err := db.Select("select table_name from information_schema.tables", Filter{Field: "table_type", Compare: "=", Value: "BASE TABLE"})
  90. if err != nil {
  91. return tp, err
  92. }
  93. tables = tp
  94. }
  95. return tables, nil
  96. }
  97. func (db DB) GetMeta(tableName interface{}) (interface{}, error) {
  98. var meta interface{}
  99. if db.driver == SQLITE_DRIVER {
  100. tm, err := db.sqliteMeta(tableName)
  101. if err != nil {
  102. return meta, err
  103. }
  104. meta = tm
  105. }
  106. if db.driver == POSTGRES_DRIVER {
  107. pm, err := db.postgresMeta(fmt.Sprint(tableName))
  108. if err != nil {
  109. return pm, err
  110. }
  111. meta = pm
  112. }
  113. return meta, nil
  114. }
  115. func (db DB) postgresMeta(tableName string) ([]interface{}, error) {
  116. q := "SELECT columns.table_name,columns.column_name,columns.data_type,columns.column_default,columns.is_nullable FROM information_schema.columns"
  117. mp, err := db.Select(q, Filter{Field: "columns.table_name", Compare: "=", Value: tableName})
  118. if err != nil {
  119. return nil, err
  120. }
  121. return mp, nil
  122. }
  123. // get table meta data
  124. func (db DB) sqliteMeta(tableName interface{}) ([]TableInfo, error) {
  125. var info []TableInfo
  126. str := fmt.Sprint(tableName)
  127. q := "pragma table_info(" + str + ")"
  128. row, err := db.orm.DB().Query(q)
  129. if err != nil {
  130. return info, err
  131. }
  132. var cid uint
  133. var t string
  134. var name string
  135. var notnull string
  136. var pk int
  137. var dfltValue interface{}
  138. for row.Next() {
  139. err = row.Scan(&cid, &name, &t, &notnull, &dfltValue, &pk)
  140. if err != nil {
  141. return info, err
  142. }
  143. table_info := TableInfo{
  144. Cid: cid,
  145. Name: name,
  146. Type: t,
  147. Notnull: notnull,
  148. DfltValue: dfltValue,
  149. Pk: pk,
  150. }
  151. info = append(info, table_info)
  152. }
  153. return info, nil
  154. }
  155. func (db DB) Select(para string, filter Filter) ([]interface{}, error) {
  156. var tables []interface{}
  157. row, err := db.orm.Select(para).Where(filter.Field+" "+filter.Compare+" ?", filter.Value).Rows()
  158. if err != nil {
  159. return tables, err
  160. }
  161. columns, err := row.Columns()
  162. if err != nil {
  163. return tables, err
  164. }
  165. for row.Next() {
  166. values := make([]interface{}, len(columns))
  167. record := make([]interface{}, len(columns))
  168. for i, _ := range columns {
  169. values[i] = &record[i]
  170. }
  171. err = row.Scan(values...)
  172. if err != nil {
  173. return tables, err
  174. }
  175. for _, v := range record {
  176. var str string
  177. switch value := v.(type) {
  178. case int64:
  179. str = fmt.Sprint(value)
  180. case float64:
  181. str = fmt.Sprintf("%f", value)
  182. default:
  183. str = fmt.Sprintf("%s", value)
  184. }
  185. tables = append(tables, str)
  186. }
  187. }
  188. return tables, nil
  189. }
  190. func (db DB) sqliteTables() ([]interface{}, error) {
  191. var tables []interface{}
  192. var sqlMaster []SqliteMaster
  193. err := db.Get(&sqlMaster, nil, "", 0, 0, false)
  194. if err != nil {
  195. return tables, err
  196. }
  197. for _, t := range sqlMaster {
  198. if t.Type == "table" {
  199. tables = append(tables, t.TblName)
  200. }
  201. }
  202. return tables, nil
  203. }