diff --git a/query_test.go b/query_test.go index b7ab1f5d..5867612f 100644 --- a/query_test.go +++ b/query_test.go @@ -50,6 +50,19 @@ func TestFirstAndLastWithNoStdPrimaryKey(t *testing.T) { } } +func TestUIntPrimaryKey(t *testing.T) { + var animal Animal + DB.First(&animal, uint64(1)) + if animal.Counter != 1 { + t.Errorf("Fetch a record from with a non-int primary key should work, but failed") + } + + DB.Model(Animal{}).Where(Animal{Counter: uint64(2)}).Scan(&animal) + if animal.Counter != 2 { + t.Errorf("Fetch a record from with a non-int primary key should work, but failed") + } +} + func TestFindAsSliceOfPointers(t *testing.T) { DB.Save(&User{Name: "user"}) diff --git a/scope_private.go b/scope_private.go index 85c5462a..fb8275b6 100644 --- a/scope_private.go +++ b/scope_private.go @@ -25,11 +25,11 @@ func (scope *Scope) buildWhereCondition(clause map[string]interface{}) (str stri } else { str = value } - case int, int64, int32: + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: return scope.primaryCondiation(scope.AddToVars(value)) case sql.NullInt64: return scope.primaryCondiation(scope.AddToVars(value.Int64)) - case []int64, []int, []int32, []string: + case []int, []int8, []int16, []int32, []int64, []uint, []uint8, []uint16, []uint32, []uint64, []string: str = fmt.Sprintf("(%v in (?))", scope.Quote(scope.PrimaryKey())) clause["args"] = []interface{}{value} case map[string]interface{}: @@ -84,9 +84,9 @@ func (scope *Scope) buildNotCondition(clause map[string]interface{}) (str string str = fmt.Sprintf("(%v NOT IN (?))", scope.Quote(value)) notEqualSql = fmt.Sprintf("(%v <> ?)", scope.Quote(value)) } - case int, int64, int32: + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: return fmt.Sprintf("(%v <> %v)", scope.Quote(scope.PrimaryKey()), value) - case []int64, []int, []int32, []string: + case []int, []int8, []int16, []int32, []int64, []uint, []uint8, []uint16, []uint32, []uint64, []string: if reflect.ValueOf(value).Len() > 0 { str = fmt.Sprintf("(%v not in (?))", scope.Quote(scope.PrimaryKey())) clause["args"] = []interface{}{value} diff --git a/scope_test.go b/scope_test.go index cf2f626c..42458995 100644 --- a/scope_test.go +++ b/scope_test.go @@ -2,7 +2,6 @@ package gorm_test import ( "github.com/jinzhu/gorm" - "testing" ) diff --git a/search.go b/search.go index 44171365..8591d659 100644 --- a/search.go +++ b/search.go @@ -1,6 +1,6 @@ package gorm -import "strconv" +import "fmt" type search struct { db *DB @@ -125,17 +125,15 @@ func (s *search) table(name string) *search { } func (s *search) getInterfaceAsSql(value interface{}) (str string) { - switch value := value.(type) { - case string: - str = value - case int: - if value < 0 { - str = "" - } else { - str = strconv.Itoa(value) - } + switch value.(type) { + case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + str = fmt.Sprintf("%v", value) default: s.db.err(InvalidSql) } + + if str == "-1" { + return "" + } return } diff --git a/structs_test.go b/structs_test.go index 023adcd0..d1877376 100644 --- a/structs_test.go +++ b/structs_test.go @@ -94,7 +94,6 @@ type Role struct { Name string } - func (role *Role) Scan(value interface{}) error { if b, ok := value.([]uint8); ok { role.Name = string(b) @@ -126,7 +125,7 @@ func (i *Num) Scan(src interface{}) error { } type Animal struct { - Counter int64 `gorm:"primary_key:yes"` + Counter uint64 `gorm:"primary_key:yes"` Name string From string //test reserved sql keyword as field name CreatedAt time.Time