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