123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- // Copyright 2018 Huan Du. All rights reserved.
- // Licensed under the MIT license that can be found in the LICENSE file.
- package sqlbuilder
- import (
- "bytes"
- "fmt"
- "strings"
- )
- // NewInsertBuilder creates a new INSERT builder.
- func NewInsertBuilder() *InsertBuilder {
- return DefaultFlavor.NewInsertBuilder()
- }
- func newInsertBuilder() *InsertBuilder {
- args := &Args{}
- return &InsertBuilder{
- verb: "INSERT",
- args: args,
- }
- }
- // InsertBuilder is a builder to build INSERT.
- type InsertBuilder struct {
- verb string
- table string
- cols []string
- values [][]string
- args *Args
- }
- // InsertInto sets table name in INSERT.
- func (ib *InsertBuilder) InsertInto(table string) *InsertBuilder {
- ib.table = Escape(table)
- return ib
- }
- // InsertIgnoreInto sets table name in INSERT IGNORE.
- func (ib *InsertBuilder) InsertIgnoreInto(table string) *InsertBuilder {
- ib.verb = "INSERT IGNORE"
- ib.table = Escape(table)
- return ib
- }
- // ReplaceInto sets table name and changes the verb of ib to REPLACE.
- // REPLACE INTO is a MySQL extension to the SQL standard.
- func (ib *InsertBuilder) ReplaceInto(table string) *InsertBuilder {
- ib.verb = "REPLACE"
- ib.table = Escape(table)
- return ib
- }
- // Cols sets columns in INSERT.
- func (ib *InsertBuilder) Cols(col ...string) *InsertBuilder {
- ib.cols = EscapeAll(col...)
- return ib
- }
- // Values adds a list of values for a row in INSERT.
- func (ib *InsertBuilder) Values(value ...interface{}) *InsertBuilder {
- placeholders := make([]string, 0, len(value))
- for _, v := range value {
- placeholders = append(placeholders, ib.args.Add(v))
- }
- ib.values = append(ib.values, placeholders)
- return ib
- }
- // String returns the compiled INSERT string.
- func (ib *InsertBuilder) String() string {
- s, _ := ib.Build()
- return s
- }
- // Build returns compiled INSERT string and args.
- // They can be used in `DB#Query` of package `database/sql` directly.
- func (ib *InsertBuilder) Build() (sql string, args []interface{}) {
- return ib.BuildWithFlavor(ib.args.Flavor)
- }
- // BuildWithFlavor returns compiled INSERT string and args with flavor and initial args.
- // They can be used in `DB#Query` of package `database/sql` directly.
- func (ib *InsertBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{}) {
- buf := &bytes.Buffer{}
- buf.WriteString(ib.verb)
- buf.WriteString(" INTO ")
- buf.WriteString(ib.table)
- if len(ib.cols) > 0 {
- buf.WriteString(" (")
- buf.WriteString(strings.Join(ib.cols, ", "))
- buf.WriteString(")")
- }
- buf.WriteString(" VALUES ")
- values := make([]string, 0, len(ib.values))
- for _, v := range ib.values {
- values = append(values, fmt.Sprintf("(%v)", strings.Join(v, ", ")))
- }
- buf.WriteString(strings.Join(values, ", "))
- return ib.args.CompileWithFlavor(buf.String(), flavor, initialArg...)
- }
- // SetFlavor sets the flavor of compiled sql.
- func (ib *InsertBuilder) SetFlavor(flavor Flavor) (old Flavor) {
- old = ib.args.Flavor
- ib.args.Flavor = flavor
- return
- }
|