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  }