1
0
mirror of https://github.com/beego/bee.git synced 2024-11-23 11:50:55 +00:00

Complete model modification

This commit is contained in:
MingZong 2016-04-01 17:17:51 +08:00
parent 2106cf4a38
commit e6815f495e
2 changed files with 166 additions and 127 deletions

View File

@ -14,7 +14,6 @@ func generateModel(mname, fields, crupath string) {
i := strings.LastIndex(p[:len(p)-1], "/") i := strings.LastIndex(p[:len(p)-1], "/")
packageName = p[i+1 : len(p)-1] packageName = p[i+1 : len(p)-1]
} }
ColorLog("[INFO] Using '%s' as model name\n", modelName) ColorLog("[INFO] Using '%s' as model name\n", modelName)
ColorLog("[INFO] Using '%s' as package name\n", packageName) ColorLog("[INFO] Using '%s' as package name\n", packageName)
fp := path.Join(crupath, "models", p) fp := path.Join(crupath, "models", p)
@ -28,9 +27,16 @@ func generateModel(mname, fields, crupath string) {
fpath := path.Join(fp, strings.ToLower(modelName)+".go") fpath := path.Join(fp, strings.ToLower(modelName)+".go")
if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil { if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil {
defer f.Close() defer f.Close()
content := strings.Replace(modelTpl, "{{packageName}}", packageName, -1) var content string
if fields != "" {
generateStructure(modelName,fields,crupath)
content = strings.Replace(CRUD_MODEL_TPL, "{{packageName}}", packageName, -1)
pkgPath := getPackagePath(crupath)
content = strings.Replace(content, "{{pkgPath}}", pkgPath, -1)
} else {
content = strings.Replace(BASE_MODEL_TPL, "{{packageName}}", packageName, -1)
}
content = strings.Replace(content, "{{modelName}}", modelName, -1) content = strings.Replace(content, "{{modelName}}", modelName, -1)
f.WriteString(content) f.WriteString(content)
// gofmt generated source code // gofmt generated source code
formatSourceCode(fpath) formatSourceCode(fpath)
@ -42,143 +48,172 @@ func generateModel(mname, fields, crupath string) {
} }
} }
var modelTpl = `package {{packageName}} const (
BASE_MODEL_TPL = `package {{packageName}}
import ( // Add{{modelName}} insert a new {{modelName}} into database and returns
"errors" // last inserted Id on success.
"fmt" func Add{{modelName}}() () {
"reflect"
"strings"
{{timePkg}}
"github.com/astaxie/beego/orm"
)
{{modelStruct}}
func init() {
orm.RegisterModel(new({{modelName}}))
}
// Add{{modelName}} insert a new {{modelName}} into database and returns
// last inserted Id on success.
func Add{{modelName}}(m *{{modelName}}) (id int64, err error) {
o := orm.NewOrm()
id, err = o.Insert(m)
return
}
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
// Id doesn't exist
func Get{{modelName}}ById(id int64) (v *{{modelName}}, err error) {
o := orm.NewOrm()
v = &{{modelName}}{Id: id}
if err = o.Read(v); err == nil {
return v, nil
} }
return nil, err
}
// GetAll{{modelName}} retrieves all {{modelName}} matches certain condition. Returns empty list if // Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
// no records exist // Id doesn't exist
func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string, func Get{{modelName}}ById() () {
offset int64, limit int64) (ml []interface{}, err error) {
o := orm.NewOrm()
qs := o.QueryTable(new({{modelName}}))
// query k=v
for k, v := range query {
// rewrite dot-notation to Object__Attribute
k = strings.Replace(k, ".", "__", -1)
qs = qs.Filter(k, v)
} }
// order by:
var sortFields []string // GetAll{{modelName}} retrieves all {{modelName}} matches certain condition. Returns empty list if
if len(sortby) != 0 { // no records exist
if len(sortby) == len(order) { func GetAll{{modelName}}() () {
// 1) for each sort field, there is an associated order
for i, v := range sortby { }
orderby := ""
if order[i] == "desc" { // Update{{modelName}} updates {{modelName}} by Id and returns error if
orderby = "-" + v // the record to be updated doesn't exist
} else if order[i] == "asc" { func Update{{modelName}}ById() () {
orderby = v
} else { }
return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
} // Delete{{modelName}} deletes {{modelName}} by Id and returns error if
sortFields = append(sortFields, orderby) // the record to be deleted doesn't exist
} func Delete{{modelName}}() () {
qs = qs.OrderBy(sortFields...)
} else if len(sortby) != len(order) && len(order) == 1 { }
// 2) there is exactly one order, all the sorted fields will be sorted by this order `
for _, v := range sortby { CRUD_MODEL_TPL = `package {{packageName}}
orderby := ""
if order[0] == "desc" { import (
orderby = "-" + v "{{pkgPath}}/structures"
} else if order[0] == "asc" { "errors"
orderby = v "fmt"
} else { "reflect"
return nil, errors.New("Error: Invalid order. Must be either [asc|desc]") "strings"
}
sortFields = append(sortFields, orderby) "github.com/astaxie/beego/orm"
} )
} else if len(sortby) != len(order) && len(order) != 1 {
return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1") // Add{{modelName}} insert a new {{modelName}} into database and returns
} // last inserted Id on success.
} else { func Add{{modelName}}(m *structures.{{modelName}}) (id int64, err error) {
if len(order) != 0 { o := orm.NewOrm()
return nil, errors.New("Error: unused 'order' fields") id, err = o.Insert(m)
return
}
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
// Id doesn't exist
func Get{{modelName}}ById(id int64) (v *structures.{{modelName}}, err error) {
o := orm.NewOrm()
v = &structures.{{modelName}}{Id: id}
if err = o.Read(v); err == nil {
return v, nil
} }
return nil, err
} }
var l []{{modelName}} // GetAll{{modelName}} retrieves all {{modelName}} matches certain condition. Returns empty list if
qs = qs.OrderBy(sortFields...) // no records exist
if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil { func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string,
if len(fields) == 0 { offset int64, limit int64) (ml []interface{}, err error) {
for _, v := range l { o := orm.NewOrm()
ml = append(ml, v) qs := o.QueryTable(new(structures.{{modelName}}))
// query k=v
for k, v := range query {
// rewrite dot-notation to Object__Attribute
k = strings.Replace(k, ".", "__", -1)
qs = qs.Filter(k, v)
}
// order by:
var sortFields []string
if len(sortby) != 0 {
if len(sortby) == len(order) {
// 1) for each sort field, there is an associated order
for i, v := range sortby {
orderby := ""
if order[i] == "desc" {
orderby = "-" + v
} else if order[i] == "asc" {
orderby = v
} else {
return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
}
sortFields = append(sortFields, orderby)
}
qs = qs.OrderBy(sortFields...)
} else if len(sortby) != len(order) && len(order) == 1 {
// 2) there is exactly one order, all the sorted fields will be sorted by this order
for _, v := range sortby {
orderby := ""
if order[0] == "desc" {
orderby = "-" + v
} else if order[0] == "asc" {
orderby = v
} else {
return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
}
sortFields = append(sortFields, orderby)
}
} else if len(sortby) != len(order) && len(order) != 1 {
return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1")
} }
} else { } else {
// trim unused fields if len(order) != 0 {
for _, v := range l { return nil, errors.New("Error: unused 'order' fields")
m := make(map[string]interface{})
val := reflect.ValueOf(v)
for _, fname := range fields {
m[fname] = val.FieldByName(fname).Interface()
}
ml = append(ml, m)
} }
} }
return ml, nil
}
return nil, err
}
// Update{{modelName}} updates {{modelName}} by Id and returns error if var l []structures.{{modelName}}
// the record to be updated doesn't exist qs = qs.OrderBy(sortFields...)
func Update{{modelName}}ById(m *{{modelName}}) (err error) { if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
o := orm.NewOrm() if len(fields) == 0 {
v := {{modelName}}{Id: m.Id} for _, v := range l {
// ascertain id exists in the database ml = append(ml, v)
if err = o.Read(&v); err == nil { }
var num int64 } else {
if num, err = o.Update(m); err == nil { // trim unused fields
fmt.Println("Number of records updated in database:", num) for _, v := range l {
m := make(map[string]interface{})
val := reflect.ValueOf(v)
for _, fname := range fields {
m[fname] = val.FieldByName(fname).Interface()
}
ml = append(ml, m)
}
}
return ml, nil
} }
return nil, err
} }
return
}
// Delete{{modelName}} deletes {{modelName}} by Id and returns error if // Update{{modelName}} updates {{modelName}} by Id and returns error if
// the record to be deleted doesn't exist // the record to be updated doesn't exist
func Delete{{modelName}}(id int64) (err error) { func Update{{modelName}}ById(m *structures.{{modelName}}) (err error) {
o := orm.NewOrm() o := orm.NewOrm()
v := {{modelName}}{Id: id} v := structures.{{modelName}}{Id: m.Id}
// ascertain id exists in the database // ascertain id exists in the database
if err = o.Read(&v); err == nil { if err = o.Read(&v); err == nil {
var num int64 var num int64
if num, err = o.Delete(&{{modelName}}{Id: id}); err == nil { if num, err = o.Update(m); err == nil {
fmt.Println("Number of records deleted in database:", num) fmt.Println("Number of records updated in database:", num)
}
} }
return
} }
return
} // Delete{{modelName}} deletes {{modelName}} by Id and returns error if
` // the record to be deleted doesn't exist
func Delete{{modelName}}(id int64) (err error) {
o := orm.NewOrm()
v := structures.{{modelName}}{Id: id}
// ascertain id exists in the database
if err = o.Read(&v); err == nil {
var num int64
if num, err = o.Delete(&structures.{{modelName}}{Id: id}); err == nil {
fmt.Println("Number of records deleted in database:", num)
}
}
return
}
`
)

View File

@ -53,7 +53,7 @@ func generateStructure(cname, fields, crupath string) {
content = strings.Replace(STRUCTURE_TPL, "{{packageName}}", packageName, -1) content = strings.Replace(STRUCTURE_TPL, "{{packageName}}", packageName, -1)
content = strings.Replace(content, "{{structStruct}}", structStruct, -1) content = strings.Replace(content, "{{structStruct}}", structStruct, -1)
if hastime { if hastime {
content = strings.Replace(content, "{{timePkg}}", `import("time")`, -1) content = strings.Replace(content, "{{timePkg}}", `"time"`, -1)
} else { } else {
content = strings.Replace(content, "{{timePkg}}", "", -1) content = strings.Replace(content, "{{timePkg}}", "", -1)
} }
@ -138,14 +138,18 @@ func getType(ktype string) (kt, tag string, hasTime bool) {
const ( const (
BAST_STRUCTURE_TPL = `package {{packageName}} BAST_STRUCTURE_TPL = `package {{packageName}}
type {{structureName}}Struct struct { type {{structureName}} struct {
} }
` `
STRUCTURE_TPL = `package {{packageName}} STRUCTURE_TPL = `package {{packageName}}
import(
"github.com/astaxie/beego/orm"
{{timePkg}} {{timePkg}}
)
{{structStruct}} {{structStruct}}