Generate sqlite insert SQL

This commit is contained in:
Jinzhu 2018-02-27 22:13:08 +08:00
parent 0a35abb59f
commit adb0e6293e

View File

@ -2,9 +2,10 @@ package sqlite
import ( import (
"bytes" "bytes"
"fmt"
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
"github.com/jinzhu/gorm/dialects/common/utils" "github.com/jinzhu/gorm/model"
// import sqlite3 driver // import sqlite3 driver
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
@ -14,27 +15,70 @@ import (
type Dialect struct { type Dialect struct {
} }
// Quote quote for value
func (dialect Dialect) Quote(name string) string {
return fmt.Sprintf(`"%s"`, name)
}
// Insert insert // Insert insert
func (*Dialect) Insert(tx *gorm.DB) error { func (dialect *Dialect) Insert(tx *gorm.DB) (err error) {
var ( var (
args []interface{} args []interface{}
defaultValueColumns []string assignmentsChan = model.GetAssignments(tx)
assignmentsChan = utils.GetCreatingAssignments(tx) tableNameChan = model.GetTable(tx)
tableNameChan = utils.GetTable(tx)
) )
s := bytes.NewBufferString("INSERT INTO ") s := bytes.NewBufferString("INSERT INTO ")
s.WriteString(<-tableNameChan) tableName := <-tableNameChan
s.WriteString(tableName)
if assignments := <-assignmentsChan; len(assignments) > 0 { if assignments := <-assignmentsChan; len(assignments) > 0 {
for column, value := range assignments { columns := []string{}
args = append(args, value...)
// Write columns (table.column1, table.column2, table.column3)
s.WriteString(" (")
// Write values (v1, v2, v3), (v2-1, v2-2, v2-3)
valueBuffer := bytes.NewBufferString("VALUES ")
for idx, fields := range assignments {
if idx != 0 {
s.WriteString(", ")
} }
} else { valueBuffer = bytes.NewBufferString(" (")
// assign default value
for j, field := range fields {
if idx == 0 {
columns = append(columns, field.Field.DBName)
if j != 0 {
s.WriteString(", ")
}
s.WriteString(dialect.Quote(tableName))
s.WriteString(".")
s.WriteString(dialect.Quote(field.Field.DBName))
} }
return nil if j != 0 {
valueBuffer.WriteString(", ")
}
valueBuffer.WriteString("?")
if field.IsBlank {
args = append(args, field.Field.DefaultValue)
} else {
args = append(args, field.Value.Interface())
}
}
valueBuffer = bytes.NewBufferString(") ")
}
s.WriteString(") ")
_, err = valueBuffer.WriteTo(s)
} else {
s.WriteString(" DEFAULT VALUES")
}
return
} }
// Query query // Query query