sql.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. package sdk
  2. import (
  3. "errors"
  4. "git.sxidc.com/go-tools/utils/strutils"
  5. "git.sxidc.com/service-supports/ds-sdk/sdk/raw_sql_tpl"
  6. "git.sxidc.com/service-supports/ds-sdk/sdk/tag"
  7. "github.com/mitchellh/mapstructure"
  8. "reflect"
  9. "strings"
  10. "time"
  11. )
  12. type SqlExecutor interface {
  13. ExecuteRawSql(sql string, executeParams map[string]any) ([]map[string]any, error)
  14. ExecuteSql(name string, executeParams map[string]any) ([]map[string]any, error)
  15. }
  16. const (
  17. createdTimeFieldName = "CreatedTime"
  18. lastUpdatedTimeFieldName = "LastUpdatedTime"
  19. )
  20. func InsertEntity[T any](executor SqlExecutor, tableName string, e T) error {
  21. if executor == nil {
  22. return errors.New("没有传递执行器")
  23. }
  24. if strutils.IsStringEmpty(tableName) {
  25. return errors.New("没有传递表名")
  26. }
  27. if reflect.TypeOf(e) == nil {
  28. return errors.New("没有传递实体")
  29. }
  30. sqlMapping, err := tag.ParseSqlMapping(e)
  31. if err != nil {
  32. return err
  33. }
  34. tableRow := raw_sql_tpl.NewTableRows()
  35. now := time.Now()
  36. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  37. fieldType := sqlMappingColumn.ValueFieldType
  38. value := reflect.Zero(fieldType).Interface()
  39. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  40. value = sqlMappingColumn.ValueFieldValue.Interface()
  41. }
  42. if (fieldName == createdTimeFieldName || fieldName == lastUpdatedTimeFieldName) &&
  43. fieldType.String() == "time.Time" && value.(time.Time).IsZero() {
  44. value = now
  45. }
  46. err := tableRow.Add(sqlMappingColumn.Name, value).Err
  47. if err != nil {
  48. return err
  49. }
  50. }
  51. executeParamsMap, err := raw_sql_tpl.InsertExecuteParams{
  52. TableName: tableName,
  53. TableRows: tableRow,
  54. }.Map()
  55. if err != nil {
  56. return err
  57. }
  58. _, err = executor.ExecuteRawSql(raw_sql_tpl.InsertTpl, executeParamsMap)
  59. if err != nil {
  60. if strings.Contains(err.Error(), "SQLSTATE 23505") {
  61. return ErrDBRecordHasExist
  62. }
  63. return err
  64. }
  65. return nil
  66. }
  67. func DeleteEntity[T any](executor SqlExecutor, tableName string, e T) error {
  68. if executor == nil {
  69. return errors.New("没有传递执行器")
  70. }
  71. if strutils.IsStringEmpty(tableName) {
  72. return errors.New("没有传递表名")
  73. }
  74. if reflect.TypeOf(e) == nil {
  75. return errors.New("没有传递实体")
  76. }
  77. sqlMapping, err := tag.ParseSqlMapping(e)
  78. if err != nil {
  79. return err
  80. }
  81. conditions := raw_sql_tpl.NewConditions()
  82. for _, sqlMappingColumn := range sqlMapping.ColumnMap {
  83. if !sqlMappingColumn.IsKey {
  84. continue
  85. }
  86. fieldType := sqlMappingColumn.ValueFieldType
  87. value := reflect.Zero(fieldType).Interface()
  88. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  89. value = sqlMappingColumn.ValueFieldValue.Interface()
  90. }
  91. err := conditions.Equal(sqlMappingColumn.Name, value).Err
  92. if err != nil {
  93. return err
  94. }
  95. }
  96. executeParamsMap, err := raw_sql_tpl.DeleteExecuteParams{
  97. TableName: tableName,
  98. Conditions: conditions,
  99. }.Map()
  100. if err != nil {
  101. return err
  102. }
  103. _, err = executor.ExecuteRawSql(raw_sql_tpl.DeleteTpl, executeParamsMap)
  104. if err != nil {
  105. return err
  106. }
  107. return nil
  108. }
  109. func UpdateEntity[T any](executor SqlExecutor, tableName string, e T) error {
  110. if executor == nil {
  111. return errors.New("没有传递执行器")
  112. }
  113. if strutils.IsStringEmpty(tableName) {
  114. return errors.New("没有传递表名")
  115. }
  116. if reflect.TypeOf(e) == nil {
  117. return errors.New("没有传递实体")
  118. }
  119. sqlMapping, err := tag.ParseSqlMapping(e)
  120. if err != nil {
  121. return err
  122. }
  123. tableRows := raw_sql_tpl.NewTableRows()
  124. conditions := raw_sql_tpl.NewConditions()
  125. now := time.Now()
  126. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  127. if !sqlMappingColumn.IsKey && !sqlMappingColumn.CanUpdate {
  128. continue
  129. }
  130. fieldType := sqlMappingColumn.ValueFieldType
  131. value := reflect.Zero(fieldType).Interface()
  132. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  133. value = sqlMappingColumn.ValueFieldValue.Interface()
  134. }
  135. if fieldName == lastUpdatedTimeFieldName &&
  136. fieldType.String() == "time.Time" && value.(time.Time).IsZero() {
  137. value = now
  138. }
  139. // 字段为空且不能清空,不更新
  140. if reflect.ValueOf(value).IsZero() && !sqlMappingColumn.CanUpdateClear {
  141. continue
  142. }
  143. if !sqlMappingColumn.IsKey {
  144. err := tableRows.Add(sqlMappingColumn.Name, value).Err
  145. if err != nil {
  146. return err
  147. }
  148. }
  149. if sqlMappingColumn.IsKey {
  150. err := conditions.Equal(sqlMappingColumn.Name, value).Err
  151. if err != nil {
  152. return err
  153. }
  154. }
  155. }
  156. executeParamsMap, err := raw_sql_tpl.UpdateExecuteParams{
  157. TableName: tableName,
  158. TableRows: tableRows,
  159. Conditions: conditions,
  160. }.Map()
  161. if err != nil {
  162. return err
  163. }
  164. _, err = executor.ExecuteRawSql(raw_sql_tpl.UpdateTpl, executeParamsMap)
  165. if err != nil {
  166. return err
  167. }
  168. return nil
  169. }
  170. func Insert(executor SqlExecutor, executeParams *raw_sql_tpl.InsertExecuteParams) error {
  171. if executor == nil {
  172. return errors.New("没有传递执行器")
  173. }
  174. if executeParams == nil {
  175. return errors.New("没有传递执行参数")
  176. }
  177. executeParamsMap, err := executeParams.Map()
  178. if err != nil {
  179. return err
  180. }
  181. _, err = executor.ExecuteRawSql(raw_sql_tpl.InsertTpl, executeParamsMap)
  182. if err != nil {
  183. return err
  184. }
  185. return nil
  186. }
  187. func Delete(executor SqlExecutor, executeParams *raw_sql_tpl.DeleteExecuteParams) error {
  188. if executor == nil {
  189. return errors.New("没有传递执行器")
  190. }
  191. if executeParams == nil {
  192. return errors.New("没有传递执行参数")
  193. }
  194. executeParamsMap, err := executeParams.Map()
  195. if err != nil {
  196. return err
  197. }
  198. _, err = executor.ExecuteRawSql(raw_sql_tpl.DeleteTpl, executeParamsMap)
  199. if err != nil {
  200. return err
  201. }
  202. return nil
  203. }
  204. func Update(executor SqlExecutor, executeParams *raw_sql_tpl.UpdateExecuteParams) error {
  205. if executor == nil {
  206. return errors.New("没有传递执行器")
  207. }
  208. if executeParams == nil {
  209. return errors.New("没有传递执行参数")
  210. }
  211. executeParamsMap, err := executeParams.Map()
  212. if err != nil {
  213. return err
  214. }
  215. _, err = executor.ExecuteRawSql(raw_sql_tpl.UpdateTpl, executeParamsMap)
  216. if err != nil {
  217. return err
  218. }
  219. return nil
  220. }
  221. func Query(executor SqlExecutor, executeParams *raw_sql_tpl.QueryExecuteParams) ([]map[string]any, int64, error) {
  222. if executor == nil {
  223. return nil, 0, errors.New("没有传递执行器")
  224. }
  225. if executeParams == nil {
  226. return nil, 0, errors.New("没有传递执行参数")
  227. }
  228. queryExecuteParamsMap, err := executeParams.Map()
  229. if err != nil {
  230. return nil, 0, err
  231. }
  232. countExecuteParamsMap, err := raw_sql_tpl.CountExecuteParams{
  233. TableName: executeParams.TableName,
  234. Conditions: executeParams.Conditions,
  235. }.Map()
  236. if err != nil {
  237. return nil, 0, err
  238. }
  239. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.QueryTpl, queryExecuteParamsMap)
  240. if err != nil {
  241. return nil, 0, err
  242. }
  243. countTableRow, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, countExecuteParamsMap)
  244. if err != nil {
  245. return nil, 0, err
  246. }
  247. return tableRows, int64(countTableRow[0]["count"].(float64)), nil
  248. }
  249. func QueryOne(executor SqlExecutor, executeParams *raw_sql_tpl.QueryOneExecuteParams) (map[string]any, error) {
  250. if executor == nil {
  251. return nil, errors.New("没有传递执行器")
  252. }
  253. if executeParams == nil {
  254. return nil, errors.New("没有传递执行参数")
  255. }
  256. executeParamsMap, err := executeParams.Map()
  257. if err != nil {
  258. return nil, err
  259. }
  260. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.QueryTpl, executeParamsMap)
  261. if err != nil {
  262. return nil, err
  263. }
  264. if tableRows == nil || len(tableRows) == 0 {
  265. return nil, ErrDBRecordNotExist
  266. }
  267. return tableRows[0], nil
  268. }
  269. func Count(executor SqlExecutor, executeParams *raw_sql_tpl.CountExecuteParams) (int64, error) {
  270. if executor == nil {
  271. return 0, errors.New("没有传递执行器")
  272. }
  273. if executeParams == nil {
  274. return 0, errors.New("没有传递执行参数")
  275. }
  276. executeParamsMap, err := executeParams.Map()
  277. if err != nil {
  278. return 0, err
  279. }
  280. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, executeParamsMap)
  281. if err != nil {
  282. return 0, err
  283. }
  284. return int64(tableRows[0]["count"].(float64)), nil
  285. }
  286. func CheckExist(executor SqlExecutor, executeParams *raw_sql_tpl.CheckExistExecuteParams) (bool, error) {
  287. if executor == nil {
  288. return false, errors.New("没有传递执行器")
  289. }
  290. if executeParams == nil {
  291. return false, errors.New("没有传递执行参数")
  292. }
  293. executeParamsMap, err := executeParams.Map()
  294. if err != nil {
  295. return false, err
  296. }
  297. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, executeParamsMap)
  298. if err != nil {
  299. return false, err
  300. }
  301. return int64(tableRows[0]["count"].(float64)) > 0, nil
  302. }
  303. func CheckHasOnlyOne(executor SqlExecutor, executeParams *raw_sql_tpl.CheckHasOnlyOneExecuteParams) (bool, error) {
  304. if executor == nil {
  305. return false, errors.New("没有传递执行器")
  306. }
  307. if executeParams == nil {
  308. return false, errors.New("没有传递执行参数")
  309. }
  310. executeParamsMap, err := executeParams.Map()
  311. if err != nil {
  312. return false, err
  313. }
  314. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, executeParamsMap)
  315. if err != nil {
  316. return false, err
  317. }
  318. return int64(tableRows[0]["count"].(float64)) == 1, nil
  319. }
  320. func ExecuteRawSql(executor SqlExecutor, sql string, executeParams map[string]any) ([]map[string]any, error) {
  321. if executor == nil {
  322. return nil, errors.New("没有传递执行器")
  323. }
  324. if strutils.IsStringEmpty(sql) {
  325. return nil, errors.New("没有sql")
  326. }
  327. tableRows, err := executor.ExecuteRawSql(sql, executeParams)
  328. if err != nil {
  329. return nil, err
  330. }
  331. return tableRows, nil
  332. }
  333. func ExecuteSql(executor SqlExecutor, name string, executeParams map[string]any) ([]map[string]any, error) {
  334. if executor == nil {
  335. return nil, errors.New("没有传递执行器")
  336. }
  337. if strutils.IsStringEmpty(name) {
  338. return nil, errors.New("没有sql资源名称")
  339. }
  340. tableRows, err := executor.ExecuteSql(name, executeParams)
  341. if err != nil {
  342. return nil, err
  343. }
  344. return tableRows, nil
  345. }
  346. const (
  347. sqlResultTimeMicroFormat = "2006-01-02T15:04:05.000000+08:00"
  348. sqlResultTimeMilliFormat = "2006-01-02T15:04:05.000+08:00"
  349. sqlResultTimeSecFormat = "2006-01-02T15:04:05+08:00"
  350. )
  351. func ParseSqlResults(results any, e any) error {
  352. decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
  353. DecodeHook: func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
  354. if f.Kind() != reflect.String {
  355. return data, nil
  356. }
  357. if t != reflect.TypeOf(time.Time{}) {
  358. return data, nil
  359. }
  360. var layout string
  361. timeStr := data.(string)
  362. if strings.HasSuffix(timeStr, ".000000+08:00") {
  363. layout = sqlResultTimeMicroFormat
  364. } else if strings.HasSuffix(timeStr, ".000+08:00") {
  365. layout = sqlResultTimeMilliFormat
  366. } else {
  367. layout = sqlResultTimeSecFormat
  368. }
  369. return time.ParseInLocation(layout, data.(string), time.Local)
  370. },
  371. Result: e,
  372. })
  373. if err != nil {
  374. return err
  375. }
  376. err = decoder.Decode(results)
  377. if err != nil {
  378. return err
  379. }
  380. return nil
  381. }