sql.go 10 KB

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