From c81bbf9801a89da081f8a0599e5da7503541d769 Mon Sep 17 00:00:00 2001 From: slene Date: Fri, 16 Aug 2013 21:57:39 +0800 Subject: [PATCH] orm now use a filed named `Id` as default auto primary key, you can ignore `orm:"auto"` setting --- orm/models_boot.go | 22 ++++++++++++++++++++-- orm/models_info_f.go | 12 ++++++++++-- orm/models_test.go | 28 ++++++++++++++-------------- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/orm/models_boot.go b/orm/models_boot.go index 10be132b..fa18d394 100644 --- a/orm/models_boot.go +++ b/orm/models_boot.go @@ -32,8 +32,26 @@ func registerModel(model interface{}) { } if info.fields.pk == nil { - fmt.Printf(" `%s` need a primary key field\n", name) - os.Exit(2) + outFor: + for _, fi := range info.fields.fieldsDB { + if fi.name == "Id" { + if fi.sf.Tag.Get(defaultStructTagName) == "" { + switch fi.addrValue.Elem().Kind() { + case reflect.Int, reflect.Int64, reflect.Int32: + fi.auto = true + fi.pk = true + info.fields.pk = fi + break outFor + } + } + } + } + + if info.fields.pk == nil { + fmt.Printf(" `%s` need a primary key field\n", name) + os.Exit(2) + } + } info.table = table diff --git a/orm/models_info_f.go b/orm/models_info_f.go index 517179f4..b5cbd958 100644 --- a/orm/models_info_f.go +++ b/orm/models_info_f.go @@ -89,7 +89,7 @@ type fieldInfo struct { fullName string column string addrValue reflect.Value - sf *reflect.StructField + sf reflect.StructField auto bool pk bool null bool @@ -244,7 +244,7 @@ checkType: fi.name = sf.Name fi.column = getColumnName(fieldType, addrField, sf, tags["column"]) fi.addrValue = addrField - fi.sf = &sf + fi.sf = sf fi.fullName = mi.fullName + "." + sf.Name fi.null = attrs["null"] @@ -358,6 +358,14 @@ checkType: if fi.auto || fi.pk { if fi.auto { + + switch addrField.Elem().Kind() { + case reflect.Int, reflect.Int32, reflect.Int64: + default: + err = fmt.Errorf("auto primary key only support int, int32, int64, but found `%s`", addrField.Elem().Kind()) + goto end + } + fi.pk = true } fi.null = false diff --git a/orm/models_test.go b/orm/models_test.go index 80923603..bd2dcd28 100644 --- a/orm/models_test.go +++ b/orm/models_test.go @@ -13,10 +13,10 @@ import ( ) type Data struct { - Id int `orm:"auto"` + Id int Boolean bool - Char string `orm:"size(50)"` - Text string + Char string `orm:size(50)` + Text string `orm:"type(text)"` Date time.Time `orm:"type(date)"` DateTime time.Time Byte byte @@ -37,10 +37,10 @@ type Data struct { } type DataNull struct { - Id int `orm:"auto"` + Id int Boolean bool `orm:"null"` Char string `orm:"size(50);null"` - Text string `orm:"null"` + Text string `orm:"type(text);null"` Date time.Time `orm:"type(date);null"` DateTime time.Time `orm:"null"` Byte byte `orm:"null"` @@ -61,7 +61,7 @@ type DataNull struct { } type User struct { - Id int `orm:"auto"` + Id int UserName string `orm:"size(30);unique"` Email string `orm:"size(100)"` Password string `orm:"size(100)"` @@ -81,10 +81,10 @@ func NewUser() *User { } type Profile struct { - Id int `orm:"auto"` - Age int16 `` - Money float64 `` - User *User `orm:"reverse(one)" json:"-"` + Id int + Age int16 + Money float64 + User *User `orm:"reverse(one)" json:"-"` } func (u *Profile) TableName() string { @@ -97,8 +97,8 @@ func NewProfile() *Profile { } type Post struct { - Id int `orm:"auto"` - User *User `orm:"rel(fk)"` // + Id int + User *User `orm:"rel(fk)"` Title string `orm:"size(60)"` Content string `` Created time.Time `orm:"auto_now_add"` @@ -112,7 +112,7 @@ func NewPost() *Post { } type Tag struct { - Id int `orm:"auto"` + Id int Name string `orm:"size(30)"` Posts []*Post `orm:"reverse(many)" json:"-"` } @@ -123,7 +123,7 @@ func NewTag() *Tag { } type Comment struct { - Id int `orm:"auto"` + Id int Post *Post `orm:"rel(fk)"` Content string `` Parent *Comment `orm:"null;rel(fk)"`