value.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package sql
  2. import (
  3. "git.sxidc.com/go-tools/utils/reflectutils"
  4. "git.sxidc.com/service-supports/fserr"
  5. "reflect"
  6. "strings"
  7. "time"
  8. )
  9. const (
  10. timeWriteFormat = time.DateTime + ".000000 +08:00"
  11. )
  12. func toSqlValue(value any) (string, error) {
  13. if value == nil {
  14. return "", nil
  15. }
  16. valueValue := reflect.ValueOf(value)
  17. if valueValue.Kind() == reflect.Slice {
  18. return "", fserr.New("请使用toSqlValues处理slice类型")
  19. }
  20. switch v := reflectutils.PointerValueElem(valueValue).Interface().(type) {
  21. case string:
  22. return "'" + v + "'", nil
  23. case time.Time:
  24. return "'" + v.Format(timeWriteFormat) + "'", nil
  25. default:
  26. retStr := new(string)
  27. err := reflectutils.AssignStringValue(v, reflect.ValueOf(retStr).Elem())
  28. if err != nil {
  29. return "", err
  30. }
  31. return *retStr, nil
  32. }
  33. }
  34. func toSqlValues(values any) (string, error) {
  35. if values == nil {
  36. return "()", nil
  37. }
  38. sliceValue := reflect.ValueOf(values)
  39. if sliceValue.IsZero() {
  40. return "()", nil
  41. }
  42. if sliceValue.Kind() != reflect.Slice {
  43. return "", fserr.New("传递的不是slice")
  44. }
  45. parsedValues := make([]string, 0)
  46. for i := 0; i < sliceValue.Len(); i++ {
  47. value := sliceValue.Index(i).Interface()
  48. parsedValue, err := toSqlValue(value)
  49. if err != nil {
  50. return "", err
  51. }
  52. parsedValues = append(parsedValues, parsedValue)
  53. }
  54. if len(parsedValues) == 0 {
  55. return "()", nil
  56. }
  57. return "(" + strings.Join(parsedValues, ",") + ")", nil
  58. }