update.tpl 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. func (m *default{{.upperStartCamelObject}}Model) Update(ctx context.Context, {{if .containsIndexCache}}newData{{else}}data{{end}} *{{.upperStartCamelObject}}) error {
  2. {{if .withCache}}{{if .containsIndexCache}}data, err:=m.FindOne(ctx, newData.{{.upperStartCamelPrimaryKey}})
  3. if err!=nil{
  4. return err
  5. }
  6. {{end}} {{.keys}}
  7. _, {{if .containsIndexCache}}err{{else}}err:{{end}}= m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
  8. query := fmt.Sprintf("UPDATE %s SET %s WHERE {{.originalPrimaryKey}} = {{if .postgreSql}}$1{{else}}?{{end}}", m.table, {{.lowerStartCamelObject}}RowsWithPlaceHolder)
  9. return conn.ExecCtx(ctx, query, {{.expressionValues}})
  10. }, {{.keyValues}}){{else}}query := fmt.Sprintf("UPDATE %s SET %s WHERE {{.originalPrimaryKey}} = {{if .postgreSql}}$1{{else}}?{{end}}", m.table, {{.lowerStartCamelObject}}RowsWithPlaceHolder)
  11. _,err:=m.conn.ExecCtx(ctx, query, {{.expressionValues}}){{end}}
  12. return err
  13. }
  14. func (m *default{{.upperStartCamelObject}}Model) UpdateWithTx(ctx context.Context, session sqlx.Session, {{if .containsIndexCache}}newData{{else}}data{{end}} *{{.upperStartCamelObject}}) error {
  15. {{if .withCache}}{{if .containsIndexCache}}data, err:=m.FindOne(ctx, newData.{{.upperStartCamelPrimaryKey}})
  16. if err!=nil{
  17. return err
  18. }
  19. {{end}} {{.keys}}
  20. _, {{if .containsIndexCache}}err{{else}}err:{{end}}= m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
  21. query := fmt.Sprintf("UPDATE %s SET %s WHERE {{.originalPrimaryKey}} = {{if .postgreSql}}$1{{else}}?{{end}}", m.table, {{.lowerStartCamelObject}}RowsWithPlaceHolder)
  22. return session.ExecCtx(ctx, query, {{.expressionValues}})
  23. }, {{.keyValues}}){{else}}query := fmt.Sprintf("UPDATE %s SET %s WHERE {{.originalPrimaryKey}} = {{if .postgreSql}}$1{{else}}?{{end}}", m.table, {{.lowerStartCamelObject}}RowsWithPlaceHolder)
  24. _,err:=session.ExecCtx(ctx, query, {{.expressionValues}}){{end}}
  25. return err
  26. }
  27. func (m *default{{.upperStartCamelObject}}Model) BatchUpdate(ctx context.Context, dataList []*{{.upperStartCamelObject}}) error {
  28. if len(dataList) == 0 {
  29. return nil
  30. }
  31. {{if .withCache}}keys := make([]string, 0)
  32. {{if .containsIndexCache}}primaryKeys := make([]interface{}, 0, len(dataList))
  33. for _, item := range dataList {
  34. primaryKeys = append(primaryKeys, item.{{.upperStartCamelPrimaryKey}})
  35. }
  36. oldList, err := m.findListByPrimaryKeys(ctx, primaryKeys)
  37. if err != nil {
  38. return err
  39. }{{end}}
  40. for _, data := range {{if .containsIndexCache}}oldList{{else}}dataList{{end}} {
  41. {{.keys}}
  42. keys = append(keys, {{.keyValues}})
  43. }
  44. query, vals := m.buildBatchUpdateQuery(dataList)
  45. _, err {{if .containsIndexCache}}={{else}}:={{end}} m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
  46. return conn.ExecCtx(ctx, query, vals...)
  47. }, keys...)
  48. {{else}}query, vals := m.buildBatchUpdateQuery(dataList)
  49. _, err := m.conn.ExecCtx(ctx, query, vals...)
  50. {{end}}
  51. return err
  52. }
  53. func (m *default{{.upperStartCamelObject}}Model) BatchUpdateWithTx(ctx context.Context, session sqlx.Session, dataList []*{{.upperStartCamelObject}}) error {
  54. if len(dataList) == 0 {
  55. return nil
  56. }
  57. {{if .withCache}}keys := make([]string, 0)
  58. {{if .containsIndexCache}}primaryKeys := make([]interface{}, 0, len(dataList))
  59. for _, item := range dataList {
  60. primaryKeys = append(primaryKeys, item.{{.upperStartCamelPrimaryKey}})
  61. }
  62. oldList, err := m.findListByPrimaryKeys(ctx, primaryKeys)
  63. if err != nil {
  64. return err
  65. }{{end}}
  66. for _, data := range {{if .containsIndexCache}}oldList{{else}}dataList{{end}} {
  67. {{.keys}}
  68. keys = append(keys, {{.keyValues}})
  69. }
  70. query, vals := m.buildBatchUpdateQuery(dataList)
  71. _, err {{if .containsIndexCache}}={{else}}:={{end}} m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
  72. return session.ExecCtx(ctx, query, vals...)
  73. }, keys...)
  74. {{else}}query, vals := m.buildBatchUpdateQuery(dataList)
  75. _, err := session.ExecCtx(ctx, query, vals...)
  76. {{end}}
  77. return err
  78. }
  79. func (m *default{{.upperStartCamelObject}}Model) buildBatchUpdateQuery(dataList []*{{.upperStartCamelObject}}) (string, []interface{}) {
  80. {{if .postgreSql}}rawParts := strings.Split({{.lowerStartCamelObject}}RowsWithPlaceHolder, ", ")
  81. fields := make([]string, len(rawParts))
  82. for i, part := range rawParts {
  83. fields[i] = part[:strings.Index(part, " =")]
  84. }{{else}}fields := strings.Split(strings.ReplaceAll({{.lowerStartCamelObject}}RowsWithPlaceHolder, "=?", ""), ","){{end}}
  85. listValues := make([][]interface{}, 0, len(dataList))
  86. for _, {{if .containsIndexCache}}newData{{else}}data{{end}} := range dataList {
  87. values := make([]interface{}, 0, len(fields)+1)
  88. values = append(values, {{.expressionValues}})
  89. listValues = append(listValues, values)
  90. }
  91. vals := make([]interface{}, 0, len(dataList)*(len(fields)*2+1))
  92. setClauses := make([]string, len(fields))
  93. {{if .postgreSql}}placeholderIdx := 1{{end}}
  94. for i, field := range fields {
  95. caseClauses := make([]string, len(dataList))
  96. for j, item := range dataList {
  97. {{if .postgreSql}}caseClauses[j] = fmt.Sprintf("WHEN {{.originalPrimaryKey}} = $%d THEN $%d", placeholderIdx, placeholderIdx+1)
  98. placeholderIdx += 2{{else}}caseClauses[j] = "WHEN {{.originalPrimaryKey}} = ? THEN ?"{{end}}
  99. vals = append(vals, item.{{.upperStartCamelPrimaryKey}}, listValues[j][i])
  100. }
  101. setClauses[i] = fmt.Sprintf("%s = CASE %s ELSE %s END", field, strings.Join(caseClauses, " "), field)
  102. }
  103. wherePlaceholders := make([]string, len(dataList))
  104. for i, item := range dataList {
  105. {{if .postgreSql}}wherePlaceholders[i] = fmt.Sprintf("$%d", placeholderIdx)
  106. placeholderIdx++{{else}}wherePlaceholders[i] = "?"{{end}}
  107. vals = append(vals, item.{{.upperStartCamelPrimaryKey}})
  108. }
  109. query := fmt.Sprintf("UPDATE %s SET %s WHERE {{.originalPrimaryKey}} IN (%s)", m.table, strings.Join(setClauses, ", "), strings.Join(wherePlaceholders, ","))
  110. return query, vals
  111. }