sql.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  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. "reflect"
  8. "strconv"
  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. timeWriteFormat = time.DateTime + ".000000 +08:00"
  18. createdTimeFieldName = "CreatedTime"
  19. lastUpdatedTimeFieldName = "LastUpdatedTime"
  20. )
  21. type ValueCallback[T any] func(e T, fieldName string, value any) (retValue any, err error)
  22. type ConditionCallback[T any] func(e T, fieldName string, columnName string, value any) (retConditionOp string, retConditionValue any, err error)
  23. func Insert[T any](executor SqlExecutor, tableName string, e T, callback ValueCallback[T]) error {
  24. if executor == nil {
  25. return errors.New("没有传递执行器")
  26. }
  27. if strutils.IsStringEmpty(tableName) {
  28. return errors.New("没有传递表名")
  29. }
  30. if reflect.TypeOf(e) == nil {
  31. return errors.New("没有传递实体")
  32. }
  33. sqlMapping, err := tag.ParseSqlMapping(e)
  34. if err != nil {
  35. return err
  36. }
  37. executeParams := raw_sql_tpl.InsertExecuteParams{
  38. TableName: tableName,
  39. }
  40. now := time.Now()
  41. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  42. fieldType := sqlMappingColumn.ValueFieldType
  43. value := reflect.Zero(fieldType).Interface()
  44. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  45. value = sqlMappingColumn.ValueFieldValue.Interface()
  46. }
  47. if sqlMappingColumn.InsertCallback {
  48. if callback == nil {
  49. return errors.New("需要使用回调函数但是没有传递回调函数")
  50. }
  51. retValue, err := callback(e, fieldName, value)
  52. if err != nil {
  53. return err
  54. }
  55. retValueType := reflect.TypeOf(retValue)
  56. if retValueType == nil || retValueType.Kind() == reflect.Ptr {
  57. return errors.New("返回应当为值类型")
  58. }
  59. value = retValue
  60. }
  61. if (fieldName == createdTimeFieldName || fieldName == lastUpdatedTimeFieldName) &&
  62. fieldType.String() == "time.Time" && value.(time.Time).IsZero() {
  63. value = now
  64. }
  65. tableRowValue, err := parseValue(value)
  66. if err != nil {
  67. return err
  68. }
  69. executeParams.TableRows = append(executeParams.TableRows, raw_sql_tpl.TableRow{
  70. Column: sqlMappingColumn.Name,
  71. Value: tableRowValue,
  72. })
  73. }
  74. executeParamsMap, err := executeParams.Map()
  75. if err != nil {
  76. return err
  77. }
  78. _, err = executor.ExecuteRawSql(raw_sql_tpl.InsertTpl, executeParamsMap)
  79. if err != nil {
  80. if strings.Contains(err.Error(), "SQLSTATE 23505") {
  81. return ErrDBRecordHasExist
  82. }
  83. return err
  84. }
  85. return nil
  86. }
  87. func Delete[T any](executor SqlExecutor, tableName string, e T) error {
  88. if executor == nil {
  89. return errors.New("没有传递执行器")
  90. }
  91. if strutils.IsStringEmpty(tableName) {
  92. return errors.New("没有传递表名")
  93. }
  94. if reflect.TypeOf(e) == nil {
  95. return errors.New("没有传递实体")
  96. }
  97. sqlMapping, err := tag.ParseSqlMapping(e)
  98. if err != nil {
  99. return err
  100. }
  101. executeParams := raw_sql_tpl.DeleteExecuteParams{
  102. TableName: tableName,
  103. Conditions: make([]raw_sql_tpl.Condition, 0),
  104. }
  105. for _, sqlMappingColumn := range sqlMapping.ColumnMap {
  106. if !sqlMappingColumn.IsKey {
  107. continue
  108. }
  109. fieldType := sqlMappingColumn.ValueFieldType
  110. value := reflect.Zero(fieldType).Interface()
  111. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  112. value = sqlMappingColumn.ValueFieldValue.Interface()
  113. }
  114. tableRowValue, err := parseValue(value)
  115. if err != nil {
  116. return err
  117. }
  118. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  119. Column: sqlMappingColumn.Name,
  120. Operator: "=",
  121. Value: tableRowValue,
  122. })
  123. }
  124. executeParamsMap, err := executeParams.Map()
  125. if err != nil {
  126. return err
  127. }
  128. _, err = executor.ExecuteRawSql(raw_sql_tpl.DeleteTpl, executeParamsMap)
  129. if err != nil {
  130. return err
  131. }
  132. return nil
  133. }
  134. func Update[T any](executor SqlExecutor, tableName string, e T, callback ValueCallback[T]) error {
  135. if executor == nil {
  136. return errors.New("没有传递执行器")
  137. }
  138. if strutils.IsStringEmpty(tableName) {
  139. return errors.New("没有传递表名")
  140. }
  141. if reflect.TypeOf(e) == nil {
  142. return errors.New("没有传递实体")
  143. }
  144. sqlMapping, err := tag.ParseSqlMapping(e)
  145. if err != nil {
  146. return err
  147. }
  148. executeParams := raw_sql_tpl.UpdateExecuteParams{
  149. TableName: tableName,
  150. Conditions: make([]raw_sql_tpl.Condition, 0),
  151. }
  152. now := time.Now()
  153. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  154. if !sqlMappingColumn.IsKey && !sqlMappingColumn.CanUpdate {
  155. continue
  156. }
  157. fieldType := sqlMappingColumn.ValueFieldType
  158. value := reflect.Zero(fieldType).Interface()
  159. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  160. value = sqlMappingColumn.ValueFieldValue.Interface()
  161. }
  162. if sqlMappingColumn.UpdateCallback {
  163. if callback == nil {
  164. return errors.New("需要使用回调函数但是没有传递回调函数")
  165. }
  166. retValue, err := callback(e, fieldName, value)
  167. if err != nil {
  168. return err
  169. }
  170. retValueType := reflect.TypeOf(retValue)
  171. if retValueType == nil || retValueType.Kind() == reflect.Ptr {
  172. return errors.New("返回应当为值类型")
  173. }
  174. value = retValue
  175. }
  176. if fieldName == lastUpdatedTimeFieldName &&
  177. fieldType.String() == "time.Time" && value.(time.Time).IsZero() {
  178. value = now
  179. }
  180. // 字段为空不更新
  181. if reflect.ValueOf(value).IsZero() && !sqlMappingColumn.CanUpdateClear {
  182. continue
  183. }
  184. tableRowValue, err := parseValue(value)
  185. if err != nil {
  186. return err
  187. }
  188. if !sqlMappingColumn.IsKey {
  189. executeParams.TableRows = append(executeParams.TableRows, raw_sql_tpl.TableRow{
  190. Column: sqlMappingColumn.Name,
  191. Value: tableRowValue,
  192. })
  193. }
  194. if sqlMappingColumn.IsKey {
  195. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  196. Column: sqlMappingColumn.Name,
  197. Operator: "=",
  198. Value: tableRowValue,
  199. })
  200. }
  201. }
  202. executeParamsMap, err := executeParams.Map()
  203. if err != nil {
  204. return err
  205. }
  206. _, err = executor.ExecuteRawSql(raw_sql_tpl.UpdateTpl, executeParamsMap)
  207. if err != nil {
  208. return err
  209. }
  210. return nil
  211. }
  212. func Query[T any](executor SqlExecutor, tableName string, e T, pageNo int, pageSize int, callback ConditionCallback[T]) ([]map[string]any, int64, error) {
  213. if executor == nil {
  214. return nil, 0, errors.New("没有传递执行器")
  215. }
  216. if strutils.IsStringEmpty(tableName) {
  217. return nil, 0, errors.New("没有传递表名")
  218. }
  219. if reflect.TypeOf(e) == nil {
  220. return nil, 0, errors.New("没有传递实体")
  221. }
  222. sqlMapping, err := tag.ParseSqlMapping(e)
  223. if err != nil {
  224. return nil, 0, err
  225. }
  226. var offset int
  227. var limit int
  228. if pageNo != 0 && pageSize != 0 {
  229. offset = (pageNo - 1) * pageSize
  230. limit = pageSize
  231. }
  232. executeParams := raw_sql_tpl.QueryExecuteParams{
  233. TableName: tableName,
  234. Conditions: make([]raw_sql_tpl.Condition, 0),
  235. Limit: limit,
  236. Offset: offset,
  237. }
  238. countParams := raw_sql_tpl.CountExecuteParams{
  239. TableName: tableName,
  240. Conditions: make([]raw_sql_tpl.Condition, 0),
  241. }
  242. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  243. if !sqlMappingColumn.CanQuery {
  244. continue
  245. }
  246. fieldType := sqlMappingColumn.ValueFieldType
  247. conditionValue := reflect.Zero(fieldType).Interface()
  248. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  249. conditionValue = sqlMappingColumn.ValueFieldValue.Interface()
  250. }
  251. conditionOp := "="
  252. if sqlMappingColumn.QueryCallback {
  253. if callback == nil {
  254. return nil, 0, errors.New("需要使用回调函数但是没有传递回调函数")
  255. }
  256. retConditionOp, retConditionValue, err := callback(e, fieldName, sqlMappingColumn.Name, conditionValue)
  257. if err != nil {
  258. return nil, 0, err
  259. }
  260. retValueType := reflect.TypeOf(retConditionValue)
  261. if retValueType == nil || retValueType.Kind() == reflect.Ptr {
  262. return nil, 0, errors.New("返回应当为值类型")
  263. }
  264. conditionValue = retConditionValue
  265. conditionOp = retConditionOp
  266. }
  267. // 字段为空不更新
  268. if reflect.ValueOf(conditionValue).IsZero() {
  269. continue
  270. }
  271. tableRowValue, err := parseValue(conditionValue)
  272. if err != nil {
  273. return nil, 0, err
  274. }
  275. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  276. Column: sqlMappingColumn.Name,
  277. Operator: conditionOp,
  278. Value: tableRowValue,
  279. })
  280. countParams.Conditions = append(countParams.Conditions, raw_sql_tpl.Condition{
  281. Column: sqlMappingColumn.Name,
  282. Operator: conditionOp,
  283. Value: tableRowValue,
  284. })
  285. }
  286. executeParamsMap, err := executeParams.Map()
  287. if err != nil {
  288. return nil, 0, err
  289. }
  290. countParamsMap, err := countParams.Map()
  291. if err != nil {
  292. return nil, 0, err
  293. }
  294. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.QueryTpl, executeParamsMap)
  295. if err != nil {
  296. return nil, 0, err
  297. }
  298. countTableRow, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, countParamsMap)
  299. if err != nil {
  300. return nil, 0, err
  301. }
  302. return tableRows, int64(countTableRow[0]["count"].(float64)), nil
  303. }
  304. func QueryByKeys[T any](executor SqlExecutor, tableName string, e T) (map[string]any, error) {
  305. if executor == nil {
  306. return nil, errors.New("没有传递执行器")
  307. }
  308. if strutils.IsStringEmpty(tableName) {
  309. return nil, errors.New("没有传递表名")
  310. }
  311. if reflect.TypeOf(e) == nil {
  312. return nil, errors.New("没有传递实体")
  313. }
  314. sqlMapping, err := tag.ParseSqlMapping(e)
  315. if err != nil {
  316. return nil, err
  317. }
  318. executeParams := raw_sql_tpl.QueryExecuteParams{
  319. TableName: tableName,
  320. Conditions: make([]raw_sql_tpl.Condition, 0),
  321. Limit: 0,
  322. Offset: 0,
  323. }
  324. for _, sqlMappingColumn := range sqlMapping.ColumnMap {
  325. if !sqlMappingColumn.IsKey {
  326. continue
  327. }
  328. fieldType := sqlMappingColumn.ValueFieldType
  329. conditionValue := reflect.Zero(fieldType).Interface()
  330. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  331. conditionValue = sqlMappingColumn.ValueFieldValue.Interface()
  332. }
  333. tableRowValue, err := parseValue(conditionValue)
  334. if err != nil {
  335. return nil, err
  336. }
  337. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  338. Column: sqlMappingColumn.Name,
  339. Operator: "=",
  340. Value: tableRowValue,
  341. })
  342. }
  343. executeParamsMap, err := executeParams.Map()
  344. if err != nil {
  345. return nil, err
  346. }
  347. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.QueryTpl, executeParamsMap)
  348. if err != nil {
  349. return nil, err
  350. }
  351. if tableRows == nil || len(tableRows) == 0 {
  352. return nil, ErrDBRecordNotExist
  353. }
  354. return tableRows[0], nil
  355. }
  356. func Count[T any](executor SqlExecutor, tableName string, e T, callback ConditionCallback[T]) (int64, error) {
  357. if executor == nil {
  358. return 0, errors.New("没有传递执行器")
  359. }
  360. if strutils.IsStringEmpty(tableName) {
  361. return 0, errors.New("没有传递表名")
  362. }
  363. if reflect.TypeOf(e) == nil {
  364. return 0, errors.New("没有传递实体")
  365. }
  366. sqlMapping, err := tag.ParseSqlMapping(e)
  367. if err != nil {
  368. return 0, err
  369. }
  370. executeParams := raw_sql_tpl.CountExecuteParams{
  371. TableName: tableName,
  372. Conditions: make([]raw_sql_tpl.Condition, 0),
  373. }
  374. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  375. fieldType := sqlMappingColumn.ValueFieldType
  376. conditionValue := reflect.Zero(fieldType).Interface()
  377. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  378. conditionValue = sqlMappingColumn.ValueFieldValue.Interface()
  379. }
  380. conditionOp := "="
  381. if sqlMappingColumn.CountCallback {
  382. if callback == nil {
  383. return 0, errors.New("需要使用回调函数但是没有传递回调函数")
  384. }
  385. retConditionOp, retConditionValue, err := callback(e, fieldName, sqlMappingColumn.Name, conditionValue)
  386. if err != nil {
  387. return 0, err
  388. }
  389. retValueType := reflect.TypeOf(retConditionValue)
  390. if retValueType == nil || retValueType.Kind() == reflect.Ptr {
  391. return 0, errors.New("返回应当为值类型")
  392. }
  393. conditionValue = retConditionValue
  394. conditionOp = retConditionOp
  395. }
  396. tableRowValue, err := parseValue(conditionValue)
  397. if err != nil {
  398. return 0, err
  399. }
  400. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  401. Column: sqlMappingColumn.Name,
  402. Operator: conditionOp,
  403. Value: tableRowValue,
  404. })
  405. }
  406. executeParamsMap, err := executeParams.Map()
  407. if err != nil {
  408. return 0, err
  409. }
  410. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, executeParamsMap)
  411. if err != nil {
  412. return 0, err
  413. }
  414. return int64(tableRows[0]["count"].(float64)), nil
  415. }
  416. func CheckExist[T any](executor SqlExecutor, tableName string, e T, callback ConditionCallback[T]) (bool, error) {
  417. if executor == nil {
  418. return false, errors.New("没有传递执行器")
  419. }
  420. if strutils.IsStringEmpty(tableName) {
  421. return false, errors.New("没有传递表名")
  422. }
  423. if reflect.TypeOf(e) == nil {
  424. return false, errors.New("没有传递实体")
  425. }
  426. sqlMapping, err := tag.ParseSqlMapping(e)
  427. if err != nil {
  428. return false, err
  429. }
  430. executeParams := raw_sql_tpl.CountExecuteParams{
  431. TableName: tableName,
  432. Conditions: make([]raw_sql_tpl.Condition, 0),
  433. }
  434. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  435. fieldType := sqlMappingColumn.ValueFieldType
  436. conditionValue := reflect.Zero(fieldType).Interface()
  437. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  438. conditionValue = sqlMappingColumn.ValueFieldValue.Interface()
  439. }
  440. conditionOp := "="
  441. if sqlMappingColumn.CheckExistCallback {
  442. if callback == nil {
  443. return false, errors.New("需要使用回调函数但是没有传递回调函数")
  444. }
  445. retConditionOp, retConditionValue, err := callback(e, fieldName, sqlMappingColumn.Name, conditionValue)
  446. if err != nil {
  447. return false, err
  448. }
  449. retValueType := reflect.TypeOf(retConditionValue)
  450. if retValueType == nil || retValueType.Kind() == reflect.Ptr {
  451. return false, errors.New("返回应当为值类型")
  452. }
  453. conditionValue = retConditionValue
  454. conditionOp = retConditionOp
  455. }
  456. tableRowValue, err := parseValue(conditionValue)
  457. if err != nil {
  458. return false, err
  459. }
  460. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  461. Column: sqlMappingColumn.Name,
  462. Operator: conditionOp,
  463. Value: tableRowValue,
  464. })
  465. }
  466. executeParamsMap, err := executeParams.Map()
  467. if err != nil {
  468. return false, err
  469. }
  470. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, executeParamsMap)
  471. if err != nil {
  472. return false, err
  473. }
  474. return int64(tableRows[0]["count"].(float64)) > 0, nil
  475. }
  476. func CheckExistByKey[T any](executor SqlExecutor, tableName string, e T) (bool, error) {
  477. if executor == nil {
  478. return false, errors.New("没有传递执行器")
  479. }
  480. if strutils.IsStringEmpty(tableName) {
  481. return false, errors.New("没有传递表名")
  482. }
  483. if reflect.TypeOf(e) == nil {
  484. return false, errors.New("没有传递实体")
  485. }
  486. sqlMapping, err := tag.ParseSqlMapping(e)
  487. if err != nil {
  488. return false, err
  489. }
  490. executeParams := raw_sql_tpl.CountExecuteParams{
  491. TableName: tableName,
  492. Conditions: make([]raw_sql_tpl.Condition, 0),
  493. }
  494. for _, sqlMappingColumn := range sqlMapping.ColumnMap {
  495. if !sqlMappingColumn.IsKey {
  496. continue
  497. }
  498. fieldType := sqlMappingColumn.ValueFieldType
  499. conditionValue := reflect.Zero(fieldType).Interface()
  500. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  501. conditionValue = sqlMappingColumn.ValueFieldValue.Interface()
  502. }
  503. tableRowValue, err := parseValue(conditionValue)
  504. if err != nil {
  505. return false, err
  506. }
  507. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  508. Column: sqlMappingColumn.Name,
  509. Operator: "=",
  510. Value: tableRowValue,
  511. })
  512. }
  513. executeParamsMap, err := executeParams.Map()
  514. if err != nil {
  515. return false, err
  516. }
  517. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, executeParamsMap)
  518. if err != nil {
  519. return false, err
  520. }
  521. return int64(tableRows[0]["count"].(float64)) > 0, nil
  522. }
  523. func CheckHasOnlyOne[T any](executor SqlExecutor, tableName string, e T, callback ConditionCallback[T]) (bool, error) {
  524. if executor == nil {
  525. return false, errors.New("没有传递执行器")
  526. }
  527. if strutils.IsStringEmpty(tableName) {
  528. return false, errors.New("没有传递表名")
  529. }
  530. if reflect.TypeOf(e) == nil {
  531. return false, errors.New("没有传递实体")
  532. }
  533. sqlMapping, err := tag.ParseSqlMapping(e)
  534. if err != nil {
  535. return false, err
  536. }
  537. executeParams := raw_sql_tpl.CountExecuteParams{
  538. TableName: tableName,
  539. Conditions: make([]raw_sql_tpl.Condition, 0),
  540. }
  541. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  542. fieldType := sqlMappingColumn.ValueFieldType
  543. conditionValue := reflect.Zero(fieldType).Interface()
  544. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  545. conditionValue = sqlMappingColumn.ValueFieldValue.Interface()
  546. }
  547. conditionOp := "="
  548. if sqlMappingColumn.QueryCallback {
  549. if callback == nil {
  550. return false, errors.New("需要使用回调函数但是没有传递回调函数")
  551. }
  552. retConditionOp, retConditionValue, err := callback(e, fieldName, sqlMappingColumn.Name, conditionValue)
  553. if err != nil {
  554. return false, err
  555. }
  556. retValueType := reflect.TypeOf(retConditionValue)
  557. if retValueType == nil || retValueType.Kind() == reflect.Ptr {
  558. return false, errors.New("返回应当为值类型")
  559. }
  560. conditionValue = retConditionValue
  561. conditionOp = retConditionOp
  562. }
  563. tableRowValue, err := parseValue(conditionValue)
  564. if err != nil {
  565. return false, err
  566. }
  567. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  568. Column: sqlMappingColumn.Name,
  569. Operator: conditionOp,
  570. Value: tableRowValue,
  571. })
  572. }
  573. executeParamsMap, err := executeParams.Map()
  574. if err != nil {
  575. return false, err
  576. }
  577. tableRows, err := executor.ExecuteRawSql(raw_sql_tpl.CountTpl, executeParamsMap)
  578. if err != nil {
  579. return false, err
  580. }
  581. return int64(tableRows[0]["count"].(float64)) == 1, nil
  582. }
  583. func ExecuteRawSql(executor SqlExecutor, sql string, executeParams map[string]any) ([]map[string]any, error) {
  584. if executor == nil {
  585. return nil, errors.New("没有传递执行器")
  586. }
  587. if strutils.IsStringEmpty(sql) {
  588. return nil, errors.New("没有sql")
  589. }
  590. tableRows, err := executor.ExecuteRawSql(sql, executeParams)
  591. if err != nil {
  592. return nil, err
  593. }
  594. return tableRows, nil
  595. }
  596. func ExecuteSql(executor SqlExecutor, name string, executeParams map[string]any) ([]map[string]any, error) {
  597. if executor == nil {
  598. return nil, errors.New("没有传递执行器")
  599. }
  600. if strutils.IsStringEmpty(name) {
  601. return nil, errors.New("没有sql资源名称")
  602. }
  603. tableRows, err := executor.ExecuteSql(name, executeParams)
  604. if err != nil {
  605. return nil, err
  606. }
  607. return tableRows, nil
  608. }
  609. func parseValue(value any) (string, error) {
  610. switch v := value.(type) {
  611. case string:
  612. return "'" + v + "'", nil
  613. case bool:
  614. return strconv.FormatBool(v), nil
  615. case time.Time:
  616. return "'" + v.Format(timeWriteFormat) + "'", nil
  617. case int:
  618. return strconv.Itoa(v), nil
  619. case int8:
  620. return strconv.FormatInt(int64(v), 10), nil
  621. case int16:
  622. return strconv.FormatInt(int64(v), 10), nil
  623. case int32:
  624. return strconv.FormatInt(int64(v), 10), nil
  625. case int64:
  626. return strconv.FormatInt(v, 10), nil
  627. case uint:
  628. return strconv.FormatUint(uint64(v), 10), nil
  629. case uint8:
  630. return strconv.FormatUint(uint64(v), 10), nil
  631. case uint16:
  632. return strconv.FormatUint(uint64(v), 10), nil
  633. case uint32:
  634. return strconv.FormatUint(uint64(v), 10), nil
  635. case uint64:
  636. return strconv.FormatUint(v, 10), nil
  637. default:
  638. return "", errors.New("不支持的类型")
  639. }
  640. }