Refactor sqlite
This commit is contained in:
parent
ee50dfa818
commit
7065ea8c97
8
api.go
8
api.go
@ -148,8 +148,9 @@ func (s *DB) Find(out interface{}, where ...interface{}) *DB {
|
||||
// has inline condition
|
||||
if len(where) > 0 {
|
||||
clone := tx.clone()
|
||||
stmt = s.Statement.Clone()
|
||||
stmt = tx.Statement.Clone()
|
||||
stmt.Conditions = append(stmt.Conditions, s.Statement.BuildCondition(where[0], where[1:]...))
|
||||
clone.Statement = stmt
|
||||
tx.AddError(clone.Dialect().Query(clone))
|
||||
tx.AddError(clone.Error)
|
||||
} else {
|
||||
@ -214,8 +215,9 @@ func (s *DB) Delete(value interface{}, where ...interface{}) *DB {
|
||||
// has inline condition
|
||||
if len(where) > 0 {
|
||||
clone := tx.clone()
|
||||
stmt = s.Statement.Clone()
|
||||
stmt = tx.Statement.Clone()
|
||||
stmt.Conditions = append(stmt.Conditions, s.Statement.BuildCondition(where[0], where[1:]...))
|
||||
clone.Statement = stmt
|
||||
tx.AddError(clone.Dialect().Update(clone))
|
||||
tx.AddError(clone.Error)
|
||||
} else {
|
||||
@ -247,7 +249,7 @@ func (s *DB) Table(name string) *DB {
|
||||
func (s *DB) AddError(err error) {
|
||||
if err != nil {
|
||||
if err != ErrRecordNotFound {
|
||||
s.Config.Logger.Error(err)
|
||||
s.Config.Logger.Error(err.Error())
|
||||
}
|
||||
|
||||
if errs := s.GetErrors(); len(errs) == 0 {
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"database/sql"
|
||||
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/jinzhu/gorm/logger"
|
||||
// import sqlite3 driver
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
)
|
||||
@ -16,6 +17,7 @@ func Open(dsn string, config Config) (*gorm.DB, error) {
|
||||
dialect, err := New(dsn)
|
||||
config.Dialect = dialect
|
||||
gormConfig := gorm.Config(config)
|
||||
gormConfig.Logger = logger.DefaultLogger
|
||||
|
||||
return &gorm.DB{Config: &gormConfig}, err
|
||||
}
|
||||
|
@ -4,9 +4,9 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"github.com/jinzhu/gorm"
|
||||
)
|
||||
|
||||
@ -31,11 +31,18 @@ func TestBatchInsert(t *testing.T) {
|
||||
|
||||
DB.Create(users)
|
||||
|
||||
spew.Dump(users)
|
||||
|
||||
for _, user := range users {
|
||||
if user.ID == 0 {
|
||||
t.Errorf("User should have primary key")
|
||||
}
|
||||
|
||||
var newUser User
|
||||
if err := DB.Find(&newUser, "id = ?", user.ID).Error; err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(&newUser, user) {
|
||||
t.Errorf("User should be equal, but got %#v, should be %#v", newUser, user)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ func (dialect *Dialect) Insert(tx *gorm.DB) (err error) {
|
||||
}
|
||||
valueBuffer.WriteString("?")
|
||||
|
||||
if field.IsBlank {
|
||||
if (field.Field.IsPrimaryKey || field.HasDefaultValue) && field.IsBlank {
|
||||
args = append(args, nil)
|
||||
} else {
|
||||
args = append(args, field.Value.Interface())
|
||||
@ -136,7 +136,7 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
|
||||
// Join SQL
|
||||
if builder := <-joinChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
if len(tx.Statement.Conditions) > 0 {
|
||||
@ -147,20 +147,20 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
|
||||
|
||||
if builder := <-groupChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
if builder := <-orderChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
if builder := <-limitChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
rows, err := dialect.DB.Query(s.String(), args)
|
||||
rows, err := dialect.DB.Query(s.String(), args...)
|
||||
|
||||
if err == nil {
|
||||
err = scanRows(rows, tx.Statement.Dest)
|
||||
@ -178,10 +178,7 @@ func scanRows(rows *sql.Rows, values interface{}) (err error) {
|
||||
|
||||
if kind := results.Kind(); kind == reflect.Slice {
|
||||
isSlice = true
|
||||
resultType := results.Type().Elem()
|
||||
results.Set(reflect.MakeSlice(resultType, 0, 0))
|
||||
} else if kind != reflect.Struct || kind != reflect.Map {
|
||||
return errors.New("unsupported destination, should be slice or map or struct")
|
||||
results.Set(reflect.MakeSlice(results.Type().Elem(), 0, 0))
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
@ -209,6 +206,7 @@ func scanRows(rows *sql.Rows, values interface{}) (err error) {
|
||||
}
|
||||
|
||||
func toScanMap(columns []string, elem reflect.Value) (results []interface{}, err error) {
|
||||
var ignored interface{}
|
||||
results = make([]interface{}, len(columns))
|
||||
|
||||
switch elem.Kind() {
|
||||
@ -219,10 +217,12 @@ func toScanMap(columns []string, elem reflect.Value) (results []interface{}, err
|
||||
results[idx] = &value
|
||||
}
|
||||
case reflect.Struct:
|
||||
fieldsMap := model.Parse(elem.Interface()).FieldsMap()
|
||||
fieldsMap := model.Parse(elem.Addr().Interface()).FieldsMap()
|
||||
for idx, column := range columns {
|
||||
if f, ok := fieldsMap[column]; ok {
|
||||
results[idx] = f.Value.Addr().Interface()
|
||||
results[idx] = f.Value.Interface()
|
||||
} else {
|
||||
results[idx] = &ignored
|
||||
}
|
||||
}
|
||||
case reflect.Ptr:
|
||||
@ -276,13 +276,15 @@ func (dialect *Dialect) Update(tx *gorm.DB) (err error) {
|
||||
|
||||
if builder := <-orderChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
if builder := <-limitChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
_, err = dialect.DB.Exec(s.String(), args...)
|
||||
return err
|
||||
}
|
||||
|
||||
@ -306,13 +308,14 @@ func (dialect *Dialect) Delete(tx *gorm.DB) (err error) {
|
||||
|
||||
if builder := <-orderChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
if builder := <-limitChan; builder != nil {
|
||||
_, err = builder.SQL.WriteTo(s)
|
||||
args = append(args, builder.Args)
|
||||
args = append(args, builder.Args...)
|
||||
}
|
||||
|
||||
_, err = dialect.DB.Exec(s.String(), args...)
|
||||
return
|
||||
}
|
||||
|
@ -9,9 +9,9 @@ import (
|
||||
// Interface logger interface
|
||||
type Interface interface {
|
||||
SQL(data ...interface{})
|
||||
Info(data ...interface{})
|
||||
Warn(data ...interface{})
|
||||
Error(data ...interface{})
|
||||
Info(msg string, data ...interface{})
|
||||
Warn(msg string, data ...interface{})
|
||||
Error(msg string, data ...interface{})
|
||||
}
|
||||
|
||||
// LogLevel log level
|
||||
|
@ -19,7 +19,7 @@ var DefaultTableNameHandler func(tx *gorm.DB, tableName string) string
|
||||
// Parse parse model
|
||||
func Parse(value interface{}) *Model {
|
||||
return &Model{
|
||||
ReflectValue: reflect.ValueOf(value),
|
||||
ReflectValue: reflect.Indirect(reflect.ValueOf(value)),
|
||||
Schema: schema.Parse(value),
|
||||
}
|
||||
}
|
||||
@ -39,9 +39,16 @@ func (model *Model) FieldsMap() map[string]*Field {
|
||||
for _, bn := range sf.BindNames {
|
||||
obj = obj.FieldByName(bn)
|
||||
}
|
||||
field := &Field{Field: sf, Value: obj}
|
||||
|
||||
fieldsMap[sf.DBName] = field
|
||||
if obj.Kind() == reflect.Ptr {
|
||||
if obj.IsNil() {
|
||||
obj.Set(reflect.New(obj.Type().Elem()))
|
||||
}
|
||||
fieldsMap[sf.DBName] = &Field{Field: sf, Value: obj.Addr()}
|
||||
} else {
|
||||
fieldsMap[sf.DBName] = &Field{Field: sf, Value: obj.Addr()}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return fieldsMap
|
||||
|
@ -1,6 +1,8 @@
|
||||
package gorm
|
||||
|
||||
import "sync"
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
// Column column type
|
||||
type Column = string
|
||||
|
Loading…
x
Reference in New Issue
Block a user