diff --git a/orm/db_postgres.go b/orm/db_postgres.go index 7dbef95a..be4cd0bc 100644 --- a/orm/db_postgres.go +++ b/orm/db_postgres.go @@ -123,14 +123,16 @@ func (d *dbBasePostgres) ReplaceMarks(query *string) { } // make returning sql support for postgresql. -func (d *dbBasePostgres) HasReturningID(mi *modelInfo, query *string) (has bool) { - if mi.fields.pk.auto { - if query != nil { - *query = fmt.Sprintf(`%s RETURNING "%s"`, *query, mi.fields.pk.column) - } - has = true +func (d *dbBasePostgres) HasReturningID(mi *modelInfo, query *string) bool { + fi := mi.fields.pk + if fi.fieldType&IsPositiveIntegerField == 0 && fi.fieldType&IsIntegerField == 0 { + return false } - return + + if query != nil { + *query = fmt.Sprintf(`%s RETURNING "%s"`, *query, fi.column) + } + return true } // show table sql for postgresql. diff --git a/orm/models_test.go b/orm/models_test.go index b6ae21cf..f42d725e 100644 --- a/orm/models_test.go +++ b/orm/models_test.go @@ -392,6 +392,11 @@ type IntegerPk struct { Value string } +type UintPk struct { + Id uint32 `orm:"pk"` + Name string +} + var DBARGS = struct { Driver string Source string diff --git a/orm/orm.go b/orm/orm.go index 38c89334..6f4b7731 100644 --- a/orm/orm.go +++ b/orm/orm.go @@ -140,7 +140,14 @@ func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, i return (err == nil), id, err } - return false, ind.FieldByIndex(mi.fields.pk.fieldIndex).Int(), err + id, vid := int64(0), ind.FieldByIndex(mi.fields.pk.fieldIndex) + if mi.fields.pk.fieldType&IsPositiveIntegerField > 0 { + id = int64(vid.Uint()) + } else { + id = vid.Int() + } + + return false, id, err } // insert model data to database diff --git a/orm/orm_test.go b/orm/orm_test.go index 832c7301..0c827c2a 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -191,6 +191,7 @@ func TestSyncDb(t *testing.T) { RegisterModel(new(InLine)) RegisterModel(new(InLineOneToOne)) RegisterModel(new(IntegerPk)) + RegisterModel(new(UintPk)) err := RunSyncdb("default", true, Debug) throwFail(t, err) @@ -213,6 +214,7 @@ func TestRegisterModels(t *testing.T) { RegisterModel(new(InLine)) RegisterModel(new(InLineOneToOne)) RegisterModel(new(IntegerPk)) + RegisterModel(new(UintPk)) BootStrap() @@ -2013,3 +2015,26 @@ func TestIntegerPk(t *testing.T) { throwFail(t, AssertIs(out.Value, intPk.Value)) } } + +func TestUintPk(t *testing.T) { + name := "go" + u := &UintPk{ + Id: 8, + Name: name, + } + + created, pk, err := dORM.ReadOrCreate(u, "Id") + throwFail(t, err) + throwFail(t, AssertIs(created, true)) + throwFail(t, AssertIs(u.Name, name)) + + nu := &UintPk{Id: 8} + created, pk, err = dORM.ReadOrCreate(nu, "Id") + throwFail(t, err) + throwFail(t, AssertIs(created, false)) + throwFail(t, AssertIs(nu.Id, u.Id)) + throwFail(t, AssertIs(pk, u.Id)) + throwFail(t, AssertIs(nu.Name, name)) + + dORM.Delete(u) +}