github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sqlx/builder/stmt_insert.go (about) 1 package builder 2 3 import ( 4 "fmt" 5 ) 6 7 var ( 8 InsertValuesLengthNotMatch = fmt.Errorf("value length is not equal Col length") 9 ) 10 11 func Insert(table *Table) *StmtInsert { 12 return &StmtInsert{ 13 table: table, 14 } 15 } 16 17 type StmtInsert struct { 18 table *Table 19 modifiers []string 20 columns Columns 21 Assignments 22 values [][]interface{} 23 comment string 24 } 25 26 func (s StmtInsert) Comment(comment string) *StmtInsert { 27 s.comment = comment 28 return &s 29 } 30 31 func (s *StmtInsert) Type() StmtType { 32 return STMT_INSERT 33 } 34 35 func (s StmtInsert) Modifier(modifiers ...string) *StmtInsert { 36 s.modifiers = append(s.modifiers, modifiers...) 37 return &s 38 } 39 40 func (s StmtInsert) Columns(cols Columns) *StmtInsert { 41 s.columns = cols 42 return &s 43 } 44 45 func (s StmtInsert) Values(values ...interface{}) *StmtInsert { 46 if s.values == nil { 47 s.values = [][]interface{}{} 48 } 49 s.values = append(s.values, values) 50 return &s 51 } 52 53 func (s StmtInsert) OnDuplicateKeyUpdate(assigns ...*Assignment) *StmtInsert { 54 s.Assignments = assigns 55 return &s 56 } 57 58 func (s *StmtInsert) Expr() *Expression { 59 expr := Expr(fmt.Sprintf( 60 `%s INTO %s`, 61 statement(s.comment, "INSERT", s.modifiers...), 62 s.table.FullName(), 63 )) 64 65 expr = expr.ConcatBy(" ", s.columns.Wrap()) 66 67 for idx, vals := range s.values { 68 if s.columns.Len() != len(vals) { 69 return ExprErr(InsertValuesLengthNotMatch) 70 } 71 joiner := " VALUES " 72 if idx > 0 { 73 joiner = "," 74 } 75 expr = expr.ConcatBy(joiner, Expr( 76 "("+HolderRepeat(len(vals))+")", 77 vals..., 78 )) 79 } 80 81 if len(s.Assignments) > 0 { 82 expr = expr.ConcatBy(" ON DUPLICATE KEY UPDATE ", s.Assignments) 83 } 84 85 return expr 86 }