| 564 | } |
| 565 | |
| 566 | func (d *dbBase) InsertOrUpdateSQL(names []string, values *[]interface{}, mi *models.ModelInfo, a *alias, args ...string) (string, error) { |
| 567 | |
| 568 | args0 := "" |
| 569 | |
| 570 | switch a.Driver { |
| 571 | case DRMySQL: |
| 572 | case DRPostgres: |
| 573 | if len(args) == 0 { |
| 574 | return "", fmt.Errorf("`%s` use InsertOrUpdate must have a conflict column", a.DriverName) |
| 575 | } |
| 576 | args0 = strings.ToLower(args[0]) |
| 577 | default: |
| 578 | return "", fmt.Errorf("`%s` nonsupport InsertOrUpdate in beego", a.DriverName) |
| 579 | } |
| 580 | |
| 581 | argsMap := map[string]string{} |
| 582 | // Get on the key-value pairs |
| 583 | for _, v := range args { |
| 584 | kv := strings.Split(v, "=") |
| 585 | if len(kv) == 2 { |
| 586 | argsMap[strings.ToLower(kv[0])] = kv[1] |
| 587 | } |
| 588 | } |
| 589 | |
| 590 | quote := d.ins.TableQuote() |
| 591 | |
| 592 | buf := buffers.Get() |
| 593 | defer buffers.Put(buf) |
| 594 | |
| 595 | _, _ = buf.WriteString("INSERT INTO ") |
| 596 | _, _ = buf.WriteString(quote) |
| 597 | _, _ = buf.WriteString(mi.Table) |
| 598 | _, _ = buf.WriteString(quote) |
| 599 | _, _ = buf.WriteString(" (") |
| 600 | |
| 601 | for i, name := range names { |
| 602 | if i > 0 { |
| 603 | _, _ = buf.WriteString(", ") |
| 604 | } |
| 605 | _, _ = buf.WriteString(quote) |
| 606 | _, _ = buf.WriteString(name) |
| 607 | _, _ = buf.WriteString(quote) |
| 608 | } |
| 609 | |
| 610 | _, _ = buf.WriteString(") VALUES (") |
| 611 | |
| 612 | for i := 0; i < len(names); i++ { |
| 613 | if i > 0 { |
| 614 | _, _ = buf.WriteString(", ") |
| 615 | } |
| 616 | _, _ = buf.WriteString("?") |
| 617 | } |
| 618 | |
| 619 | _, _ = buf.WriteString(") ") |
| 620 | |
| 621 | switch a.Driver { |
| 622 | case DRMySQL: |
| 623 | _, _ = buf.WriteString("ON DUPLICATE KEY UPDATE ") |