diff --git a/config.yml b/config.yml index ddf146a..9d506c9 100644 --- a/config.yml +++ b/config.yml @@ -4,6 +4,7 @@ out_dir : ./model # 输出目录 singular_table : false # 单表模式:true:禁用表名复数,false:采用表明复数 参考:gorm.SingularTable simple : true # 简单输出(默认gorm标签不输出) is_out_sql : false # 是否输出 sql 原信息 +is_out_func : true # 是否输出 快捷函数 is_json_tag : true # 是否打json标记 is_foreign_key : true # 是否导出外键关联 mysql_info: diff --git a/data/config/MyIni.go b/data/config/MyIni.go index 114c6ee..9a93eaf 100644 --- a/data/config/MyIni.go +++ b/data/config/MyIni.go @@ -12,6 +12,7 @@ type Config struct { SingularTable bool `yaml:"singular_table"` IsForeignKey bool `yaml:"is_foreign_key"` IsOutSQL bool `yaml:"is_out_sql"` + IsOutFunc bool `yaml:"is_out_func"` } // MysqlDbInfo mysql database information. mysql 数据库信息 @@ -88,3 +89,13 @@ func SetForeignKey(b bool) { func GetIsOutSQL() bool { return _map.IsOutSQL } + +// GetIsOutFunc if is output func . +func GetIsOutFunc() bool { + return _map.IsOutFunc +} + +// SetIsOutFunc if is output func . +func SetIsOutFunc(b bool) { + _map.IsOutFunc = b +} diff --git a/data/view/genfunc/def.go b/data/view/genfunc/def.go index 3d1fa32..5fdf710 100644 --- a/data/view/genfunc/def.go +++ b/data/view/genfunc/def.go @@ -55,7 +55,7 @@ type _{{$obj.StructName}}Mgr struct { // {{$obj.StructName}}Mgr open func func {{$obj.StructName}}Mgr(db *gorm.DB) *_{{$obj.StructName}}Mgr { if db == nil { - panic(fmt.Errorf("{{$obj.StructName}}Mgr init need db")) + panic(fmt.Errorf("{{$obj.StructName}}Mgr need init by db")) } return &_{{$obj.StructName}}Mgr{_BaseMgr: &_BaseMgr{DB: db}} } @@ -64,5 +64,118 @@ func {{$obj.StructName}}Mgr(db *gorm.DB) *_{{$obj.StructName}}Mgr { func (obj *_{{$obj.StructName}}Mgr) GetTableName() string { return "{{$obj.TableName}}" } + +// Get 获取 +func (obj *_{{$obj.StructName}}Mgr) Get() (result {{$obj.StructName}}, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&result).Error + {{GenPreloadList $obj.PreloadList false}} + return +} + +// Gets 获取批量结果 +func (obj *_{{$obj.StructName}}Mgr) Gets() (results []*{{$obj.StructName}}, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&results).Error + {{GenPreloadList $obj.PreloadList true}} + return +} + +//////////////////////////option case //////////////////////////////////////////// +{{range $oem := $obj.Em}} +// With{{$oem.ColStructName}} {{$oem.ColName}}获取 {{$oem.Notes}} +func (obj *_{{$obj.StructName}}Mgr) With{{$oem.ColStructName}}({{$oem.ColStructName}} {{$oem.Type}}) Option { + return optionFunc(func(o *options) { o.query["{{$oem.ColName}}"] = {{$oem.ColStructName}} }) +} +{{end}} + +// GetByOption 功能选项模式获取 +func (obj *_{{$obj.StructName}}Mgr) GetByOption(opts ...Option) (result {{$obj.StructName}}, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&result).Error + {{GenPreloadList $obj.PreloadList false}} + return +} + +// GetByOptions 批量功能选项模式获取 +func (obj *_{{$obj.StructName}}Mgr) GetByOptions(opts ...Option) (results []*{{$obj.StructName}}, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&results).Error + + {{GenPreloadList $obj.PreloadList true}} + return +} +//////////////////////////enume case //////////////////////////////////////////// + +{{range $oem := $obj.Em}} +// GetFrom{{$oem.ColStructName}} 通过{{$oem.ColName}}获取内容 {{$oem.Notes}} {{if $oem.IsMulti}} +func (obj *_{{$obj.StructName}}Mgr) GetFrom{{$oem.ColStructName}}({{$oem.ColStructName}} {{$oem.Type}}) (results []*{{$obj.StructName}}, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("{{$oem.ColName}} = ?", {{$oem.ColStructName}}).Find(&results).Error + {{GenPreloadList $obj.PreloadList true}} + return +} +{{else}} +func (obj *_{{$obj.StructName}}Mgr) GetFrom{{$oem.ColStructName}}({{$oem.ColStructName}} {{$oem.Type}}) (result {{$obj.StructName}}, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("{{$oem.ColName}} = ?", {{$oem.ColStructName}}).Find(&result).Error + {{GenPreloadList $obj.PreloadList false}} + return +} +{{end}} +// GetsBatchFrom{{$oem.ColStructName}} 批量唯一主键查找 {{$oem.Notes}} +func (obj *_{{$obj.StructName}}Mgr) GetsBatchFrom{{$oem.ColStructName}}({{$oem.ColStructName}}s []{{$oem.Type}}) (results []*{{$obj.StructName}}, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("{{$oem.ColName}} IN (?)", {{$oem.ColStructName}}s).Find(&results).Error + {{GenPreloadList $obj.PreloadList true}} + return +} + {{end}} ` + genPreload = `if err == nil && obj.isRelated { {{range $obj := .}}{{if $obj.IsMulti}} + { + var info []{{$obj.ForeignkeyStructName}} // {{$obj.Notes}} + err = obj.DB.Table("{{$obj.ForeignkeyTableName}}").Where("{{$obj.ForeignkeyCol}} = ?", result.{{$obj.ColStructName}}).Find(&info).Error + if err != nil { + return + } + result.{{$obj.ForeignkeyStructName}}List = info + } {{else}} + { + var info {{$obj.ForeignkeyStructName}} // {{$obj.Notes}} + err = obj.DB.Table("{{$obj.ForeignkeyTableName}}").Where("{{$obj.ForeignkeyCol}} = ?", result.{{$obj.ColStructName}}).Find(&info).Error + if err != nil { + return + } + result.{{$obj.ForeignkeyStructName}} = info + } {{end}} {{end}} + } +` + genPreloadMulti = `if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { {{range $obj := .}}{{if $obj.IsMulti}} + { + var info []{{$obj.ForeignkeyStructName}} // {{$obj.Notes}} + err = obj.DB.Table("{{$obj.ForeignkeyTableName}}").Where("{{$obj.ForeignkeyCol}} = ?", results[i].{{$obj.ColStructName}}).Find(&info).Error + if err != nil { + return + } + results[i].{{$obj.ForeignkeyStructName}}List = info + } {{else}} + { + var info {{$obj.ForeignkeyStructName}} // {{$obj.Notes}} + err = obj.DB.Table("{{$obj.ForeignkeyTableName}}").Where("{{$obj.ForeignkeyCol}} = ?", results[i].{{$obj.ColStructName}}).Find(&info).Error + if err != nil { + return + } + results[i].{{$obj.ForeignkeyStructName}} = info + } {{end}} {{end}} + } +}` ) diff --git a/data/view/genfunc/gen.logic.go b/data/view/genfunc/gen.logic.go index ef51574..4062dc9 100644 --- a/data/view/genfunc/gen.logic.go +++ b/data/view/genfunc/gen.logic.go @@ -28,7 +28,7 @@ type _ExampleMgr struct { // ExampleMgr open func func ExampleMgr(db *gorm.DB) *_ExampleMgr { if db == nil { - panic(fmt.Errorf("ExampleMgr init need db")) + panic(fmt.Errorf("ExampleMgr need init by db")) } return &_ExampleMgr{_BaseMgr: &_BaseMgr{DB: db}} } @@ -116,7 +116,7 @@ func (obj *_ExampleMgr) GetByPrimaryKeys(ids []int64) (results []*Example, err e //////////////////////////option case //////////////////////////////////////////// -// GetByPrimaryKey 功能选项模式获取 +// GetByOption 功能选项模式获取 func (obj *_ExampleMgr) GetByOption(opts ...Option) (result Example, err error) { options := options{ query: make(map[string]interface{}, len(opts)), diff --git a/data/view/genfunc/genfunc.go b/data/view/genfunc/genfunc.go index 791e89c..bb09499 100644 --- a/data/view/genfunc/genfunc.go +++ b/data/view/genfunc/genfunc.go @@ -9,3 +9,11 @@ func GetGenBaseTemp() string { func GetGenLogicTemp() string { return genlogic } + +// GetGenPreloadTemp get gen preload template str +func GetGenPreloadTemp(multi bool) string { + if multi { + return genPreloadMulti + } + return genPreload +} diff --git a/data/view/genfunc/genfunc_test.go b/data/view/genfunc/genfunc_test.go index d3978b4..f13a072 100644 --- a/data/view/genfunc/genfunc_test.go +++ b/data/view/genfunc/genfunc_test.go @@ -4,26 +4,24 @@ import ( "fmt" "testing" + "github.com/xxjwxc/gormt/data/view/genfunc/model" + "github.com/xxjwxc/public/mysqldb" ) func TestFunc(t *testing.T) { orm := mysqldb.OnInitDBOrm("root:qwer@tcp(127.0.0.1:3306)/matrix?charset=utf8&parseTime=True&loc=Local") defer orm.OnDestoryDB() + mgr := model.OrganMgr(orm.DB) + mgr.IsRelated(true) // 设置允许加载外键 + res, err := mgr.GetFromUserID(2) // 通过列获取 + fmt.Println(res, err) - mgr := ExampleMgr(orm.DB) - obj, err := mgr.GetFromID(1) - fmt.Println(obj, err) - - obj1, err := mgr.GetByPrimaryKey(1) + obj1, err := mgr.GetByOptions(mgr.WithID(1), mgr.WithUserID(1)) // 批量获取 fmt.Println(obj1, err) - obj2, err := mgr.GetByPrimaryKeys([]int64{1, 2}) + obj2, err := mgr.GetByOption(mgr.WithID(1), mgr.WithUserID(1)) // 多条件获取一条 fmt.Println(obj2, err) - obj3, err := mgr.GetByOptions(mgr.WithID(1), mgr.WithUserID(1)) - fmt.Println(obj3, err) - - obj4, err := mgr.GetByOption(mgr.WithID(1), mgr.WithUserID(1)) - fmt.Println(obj4, err) + // 复合键获取 } diff --git a/data/view/genfunc/model/gen.base.go b/data/view/genfunc/model/gen.base.go new file mode 100644 index 0000000..bef14bc --- /dev/null +++ b/data/view/genfunc/model/gen.base.go @@ -0,0 +1,44 @@ +package model + +import ( + "context" + + "github.com/jinzhu/gorm" +) + +// prepare for outher +type _BaseMgr struct { + *gorm.DB + ctx *context.Context + isRelated bool +} + +// SetCtx set context +func (obj *_BaseMgr) SetCtx(c *context.Context) { + obj.ctx = c +} + +// GetDB get gorm.DB info +func (obj *_BaseMgr) GetDB() *gorm.DB { + return obj.DB +} + +// IsRelated Query foreign key Association.是否查询外键关联(gorm.Related) +func (obj *_BaseMgr) IsRelated(b bool) { + obj.isRelated = b +} + +type options struct { + query map[string]interface{} +} + +// Option overrides behavior of Connect. +type Option interface { + apply(*options) +} + +type optionFunc func(*options) + +func (f optionFunc) apply(o *options) { + f(o) +} diff --git a/data/view/genfunc/model/matrix.gen.example.go b/data/view/genfunc/model/matrix.gen.example.go new file mode 100644 index 0000000..19d37fc --- /dev/null +++ b/data/view/genfunc/model/matrix.gen.example.go @@ -0,0 +1,165 @@ +package model + +import ( + "fmt" + + "github.com/jinzhu/gorm" +) + +type _ExampleMgr struct { + *_BaseMgr +} + +// ExampleMgr open func +func ExampleMgr(db *gorm.DB) *_ExampleMgr { + if db == nil { + panic(fmt.Errorf("ExampleMgr need init by db")) + } + return &_ExampleMgr{_BaseMgr: &_BaseMgr{DB: db}} +} + +// GetTableName get sql table name.获取数据库名字 +func (obj *_ExampleMgr) GetTableName() string { + return "example" +} + +// Get 获取 +func (obj *_ExampleMgr) Get() (result Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&result).Error + + return +} + +// Gets 获取批量结果 +func (obj *_ExampleMgr) Gets() (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&results).Error + + return +} + +//////////////////////////option case //////////////////////////////////////////// + +// WithUserID user_id获取 +func (obj *_ExampleMgr) WithUserID(UserID int) Option { + return optionFunc(func(o *options) { o.query["user_id"] = UserID }) +} + +// WithName name获取 +func (obj *_ExampleMgr) WithName(Name string) Option { + return optionFunc(func(o *options) { o.query["name"] = Name }) +} + +// WithSex sex获取 +func (obj *_ExampleMgr) WithSex(Sex int) Option { + return optionFunc(func(o *options) { o.query["sex"] = Sex }) +} + +// WithJob job获取 +func (obj *_ExampleMgr) WithJob(Job int) Option { + return optionFunc(func(o *options) { o.query["job"] = Job }) +} + +// WithID id获取 +func (obj *_ExampleMgr) WithID(ID int) Option { + return optionFunc(func(o *options) { o.query["id"] = ID }) +} + +// GetByOption 功能选项模式获取 +func (obj *_ExampleMgr) GetByOption(opts ...Option) (result Example, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&result).Error + + return +} + +// GetByOptions 批量功能选项模式获取 +func (obj *_ExampleMgr) GetByOptions(opts ...Option) (results []*Example, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&results).Error + + return +} + +//////////////////////////enume case //////////////////////////////////////////// + +// GetFromUserID 通过user_id获取内容 +func (obj *_ExampleMgr) GetFromUserID(UserID int) (result Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("user_id = ?", UserID).Find(&result).Error + + return +} + +// GetsBatchFromUserID 批量唯一主键查找 +func (obj *_ExampleMgr) GetsBatchFromUserID(UserIDs []int) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("user_id IN (?)", UserIDs).Find(&results).Error + + return +} + +// GetFromName 通过name获取内容 +func (obj *_ExampleMgr) GetFromName(Name string) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("name = ?", Name).Find(&results).Error + + return +} + +// GetsBatchFromName 批量唯一主键查找 +func (obj *_ExampleMgr) GetsBatchFromName(Names []string) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("name IN (?)", Names).Find(&results).Error + + return +} + +// GetFromSex 通过sex获取内容 +func (obj *_ExampleMgr) GetFromSex(Sex int) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("sex = ?", Sex).Find(&results).Error + + return +} + +// GetsBatchFromSex 批量唯一主键查找 +func (obj *_ExampleMgr) GetsBatchFromSex(Sexs []int) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("sex IN (?)", Sexs).Find(&results).Error + + return +} + +// GetFromJob 通过job获取内容 +func (obj *_ExampleMgr) GetFromJob(Job int) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("job = ?", Job).Find(&results).Error + + return +} + +// GetsBatchFromJob 批量唯一主键查找 +func (obj *_ExampleMgr) GetsBatchFromJob(Jobs []int) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("job IN (?)", Jobs).Find(&results).Error + + return +} + +// GetFromID 通过id获取内容 +func (obj *_ExampleMgr) GetFromID(ID int) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("id = ?", ID).Find(&results).Error + + return +} + +// GetsBatchFromID 批量唯一主键查找 +func (obj *_ExampleMgr) GetsBatchFromID(IDs []int) (results []*Example, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("id IN (?)", IDs).Find(&results).Error + + return +} diff --git a/data/view/genfunc/model/matrix.gen.organ.go b/data/view/genfunc/model/matrix.gen.organ.go new file mode 100644 index 0000000..0d5e4d2 --- /dev/null +++ b/data/view/genfunc/model/matrix.gen.organ.go @@ -0,0 +1,276 @@ +package model + +import ( + "fmt" + + "github.com/jinzhu/gorm" +) + +type _OrganMgr struct { + *_BaseMgr +} + +// OrganMgr open func +func OrganMgr(db *gorm.DB) *_OrganMgr { + if db == nil { + panic(fmt.Errorf("OrganMgr need init by db")) + } + return &_OrganMgr{_BaseMgr: &_BaseMgr{DB: db}} +} + +// GetTableName get sql table name.获取数据库名字 +func (obj *_OrganMgr) GetTableName() string { + return "organ" +} + +// Get 获取 +func (obj *_OrganMgr) Get() (result Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&result).Error + if err == nil && obj.isRelated { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", result.UserID).Find(&info).Error + if err != nil { + return + } + result.UserList = info + } + } + + return +} + +// Gets 获取批量结果 +func (obj *_OrganMgr) Gets() (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +//////////////////////////option case //////////////////////////////////////////// + +// WithID id获取 +func (obj *_OrganMgr) WithID(ID int) Option { + return optionFunc(func(o *options) { o.query["id"] = ID }) +} + +// WithUserID user_id获取 +func (obj *_OrganMgr) WithUserID(UserID int) Option { + return optionFunc(func(o *options) { o.query["user_id"] = UserID }) +} + +// WithType type获取 +func (obj *_OrganMgr) WithType(Type int) Option { + return optionFunc(func(o *options) { o.query["type"] = Type }) +} + +// WithScore score获取 +func (obj *_OrganMgr) WithScore(Score int) Option { + return optionFunc(func(o *options) { o.query["score"] = Score }) +} + +// GetByOption 功能选项模式获取 +func (obj *_OrganMgr) GetByOption(opts ...Option) (result Organ, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&result).Error + if err == nil && obj.isRelated { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", result.UserID).Find(&info).Error + if err != nil { + return + } + result.UserList = info + } + } + + return +} + +// GetByOptions 批量功能选项模式获取 +func (obj *_OrganMgr) GetByOptions(opts ...Option) (results []*Organ, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&results).Error + + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +//////////////////////////enume case //////////////////////////////////////////// + +// GetFromID 通过id获取内容 +func (obj *_OrganMgr) GetFromID(ID int) (result Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("id = ?", ID).Find(&result).Error + if err == nil && obj.isRelated { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", result.UserID).Find(&info).Error + if err != nil { + return + } + result.UserList = info + } + } + + return +} + +// GetsBatchFromID 批量唯一主键查找 +func (obj *_OrganMgr) GetsBatchFromID(IDs []int) (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("id IN (?)", IDs).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +// GetFromUserID 通过user_id获取内容 +func (obj *_OrganMgr) GetFromUserID(UserID int) (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("user_id = ?", UserID).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +// GetsBatchFromUserID 批量唯一主键查找 +func (obj *_OrganMgr) GetsBatchFromUserID(UserIDs []int) (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("user_id IN (?)", UserIDs).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +// GetFromType 通过type获取内容 +func (obj *_OrganMgr) GetFromType(Type int) (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("type = ?", Type).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +// GetsBatchFromType 批量唯一主键查找 +func (obj *_OrganMgr) GetsBatchFromType(Types []int) (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("type IN (?)", Types).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +// GetFromScore 通过score获取内容 +func (obj *_OrganMgr) GetFromScore(Score int) (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("score = ?", Score).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} + +// GetsBatchFromScore 批量唯一主键查找 +func (obj *_OrganMgr) GetsBatchFromScore(Scores []int) (results []*Organ, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("score IN (?)", Scores).Find(&results).Error + if err == nil && obj.isRelated { + for i := 0; i < len(results); i++ { + { + var info []User // + err = obj.DB.Table("user").Where("sex = ?", results[i].UserID).Find(&info).Error + if err != nil { + return + } + results[i].UserList = info + } + } + } + return +} diff --git a/data/view/genfunc/model/matrix.gen.user.go b/data/view/genfunc/model/matrix.gen.user.go new file mode 100644 index 0000000..ae20592 --- /dev/null +++ b/data/view/genfunc/model/matrix.gen.user.go @@ -0,0 +1,146 @@ +package model + +import ( + "fmt" + + "github.com/jinzhu/gorm" +) + +type _UserMgr struct { + *_BaseMgr +} + +// UserMgr open func +func UserMgr(db *gorm.DB) *_UserMgr { + if db == nil { + panic(fmt.Errorf("UserMgr need init by db")) + } + return &_UserMgr{_BaseMgr: &_BaseMgr{DB: db}} +} + +// GetTableName get sql table name.获取数据库名字 +func (obj *_UserMgr) GetTableName() string { + return "user" +} + +// Get 获取 +func (obj *_UserMgr) Get() (result User, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&result).Error + + return +} + +// Gets 获取批量结果 +func (obj *_UserMgr) Gets() (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Find(&results).Error + + return +} + +//////////////////////////option case //////////////////////////////////////////// + +// WithUserID userId获取 +func (obj *_UserMgr) WithUserID(UserID int) Option { + return optionFunc(func(o *options) { o.query["userId"] = UserID }) +} + +// WithName name获取 +func (obj *_UserMgr) WithName(Name string) Option { + return optionFunc(func(o *options) { o.query["name"] = Name }) +} + +// WithSex sex获取 +func (obj *_UserMgr) WithSex(Sex int) Option { + return optionFunc(func(o *options) { o.query["sex"] = Sex }) +} + +// WithJob job获取 +func (obj *_UserMgr) WithJob(Job int) Option { + return optionFunc(func(o *options) { o.query["job"] = Job }) +} + +// GetByOption 功能选项模式获取 +func (obj *_UserMgr) GetByOption(opts ...Option) (result User, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&result).Error + + return +} + +// GetByOptions 批量功能选项模式获取 +func (obj *_UserMgr) GetByOptions(opts ...Option) (results []*User, err error) { + options := options{ + query: make(map[string]interface{}, len(opts)), + } + for _, o := range opts { + o.apply(&options) + } + + err = obj.DB.Table(obj.GetTableName()).Where(options.query).Find(&results).Error + + return +} + +//////////////////////////enume case //////////////////////////////////////////// + +// GetFromUserID 通过userId获取内容 +func (obj *_UserMgr) GetFromUserID(UserID int) (result User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("userId = ?", UserID).Find(&result).Error + + return +} + +// GetsBatchFromUserID 批量唯一主键查找 +func (obj *_UserMgr) GetsBatchFromUserID(UserIDs []int) (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("userId IN (?)", UserIDs).Find(&results).Error + + return +} + +// GetFromName 通过name获取内容 +func (obj *_UserMgr) GetFromName(Name string) (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("name = ?", Name).Find(&results).Error + + return +} + +// GetsBatchFromName 批量唯一主键查找 +func (obj *_UserMgr) GetsBatchFromName(Names []string) (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("name IN (?)", Names).Find(&results).Error + + return +} + +// GetFromSex 通过sex获取内容 +func (obj *_UserMgr) GetFromSex(Sex int) (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("sex = ?", Sex).Find(&results).Error + + return +} + +// GetsBatchFromSex 批量唯一主键查找 +func (obj *_UserMgr) GetsBatchFromSex(Sexs []int) (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("sex IN (?)", Sexs).Find(&results).Error + + return +} + +// GetFromJob 通过job获取内容 +func (obj *_UserMgr) GetFromJob(Job int) (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("job = ?", Job).Find(&results).Error + + return +} + +// GetsBatchFromJob 批量唯一主键查找 +func (obj *_UserMgr) GetsBatchFromJob(Jobs []int) (results []*User, err error) { + err = obj.DB.Table(obj.GetTableName()).Where("job IN (?)", Jobs).Find(&results).Error + + return +} diff --git a/data/view/genfunc/model/matrix.go b/data/view/genfunc/model/matrix.go new file mode 100644 index 0000000..240dd1f --- /dev/null +++ b/data/view/genfunc/model/matrix.go @@ -0,0 +1,27 @@ +package model + +// Example [...] +type Example struct { + UserID int `gorm:"primary_key" json:"user_id"` + Name string `json:"name"` + Sex int `gorm:"index" json:"sex"` + Job int `json:"job"` + ID int `json:"-"` +} + +// Organ [...] +type Organ struct { + ID int `gorm:"primary_key" json:"-"` + UserID int `gorm:"index" json:"user_id"` + UserList []User `gorm:"association_foreignkey:user_id;foreignkey:sex" json:"user_list"` + Type int `json:"type"` + Score int `json:"score"` +} + +// User [...] +type User struct { + UserID int `gorm:"primary_key" json:"user_id"` + Name string `json:"name"` + Sex int `gorm:"index" json:"sex"` + Job int `json:"job"` +} diff --git a/data/view/gtools/gtools.go b/data/view/gtools/gtools.go index 320f0f1..ad3a4e6 100644 --- a/data/view/gtools/gtools.go +++ b/data/view/gtools/gtools.go @@ -1,6 +1,9 @@ package gtools import ( + "fmt" + "os/exec" + "github.com/xxjwxc/gormt/data/view/model" "github.com/xxjwxc/gormt/data/config" @@ -28,12 +31,12 @@ func Execute() { path := config.GetOutDir() + "/" + v.FileName tools.WriteFile(path, []string{v.FileCtx}, true) - // fmt.Println("formatting differs from goimport's:") - // cmd, _ := exec.Command("goimports", "-l", "-w", path).Output() - // fmt.Println(string(cmd)) + fmt.Println("formatting differs from goimport's:") + cmd, _ := exec.Command("goimports", "-l", "-w", path).Output() + fmt.Println(string(cmd)) - // fmt.Println("formatting differs from gofmt's:") - // cmd, _ = exec.Command("gofmt", "-l", "-w", path).Output() - // fmt.Println(string(cmd)) + fmt.Println("formatting differs from gofmt's:") + cmd, _ = exec.Command("gofmt", "-l", "-w", path).Output() + fmt.Println(string(cmd)) } } diff --git a/data/view/model/common.go b/data/view/model/common.go index 4ab1eac..3c3055d 100644 --- a/data/view/model/common.go +++ b/data/view/model/common.go @@ -55,24 +55,37 @@ func getUninStr(left, middle, right string) string { return re } -func getGormModelElement() []ColumusInfo { - var result []ColumusInfo - result = append(result, ColumusInfo{ - BaseInfo: BaseInfo{Name: "id", Notes: "Primary key"}, - Type: "int64", // Type.类型标记 - Index: []KList{KList{Key: ColumusKeyPrimary}}, // index list.index列表 +func getGormModelElement() []EmInfo { + var result []EmInfo + result = append(result, EmInfo{ + IsMulti: false, + Notes: "Primary key", + Type: "int64", // Type.类型标记 + ColName: "id", + ColStructName: "ID", }) - result = append(result, ColumusInfo{ - BaseInfo: BaseInfo{Name: "created_at", Notes: "created time"}, - Type: "time.Time", // Type.类型标记 + result = append(result, EmInfo{ + IsMulti: false, + Notes: "created time", + Type: "time.Time", // Type.类型标记 + ColName: "created_at", + ColStructName: "CreatedAt", }) - result = append(result, ColumusInfo{ - BaseInfo: BaseInfo{Name: "updated_at", Notes: "updated time"}, - Type: "time.Time", // Type.类型标记 + + result = append(result, EmInfo{ + IsMulti: false, + Notes: "updated at", + Type: "time.Time", // Type.类型标记 + ColName: "updated_at", + ColStructName: "UpdatedAt", }) - result = append(result, ColumusInfo{ - BaseInfo: BaseInfo{Name: "deleted_at", Notes: "deleted time"}, - Type: "time.Time", // Type.类型标记 + + result = append(result, EmInfo{ + IsMulti: false, + Notes: "deleted time", + Type: "time.Time", // Type.类型标记 + ColName: "deleted_at", + ColStructName: "DeletedAt", }) return result } diff --git a/data/view/model/def.go b/data/view/model/def.go index 5e50363..9fe866a 100644 --- a/data/view/model/def.go +++ b/data/view/model/def.go @@ -67,3 +67,34 @@ type GenOutInfo struct { FileName string // output file name .输出文件名 FileCtx string // output file context. 输出文件内容 } + +// def func sturct + +// PreloadInfo 预加载列表 +type PreloadInfo struct { + IsMulti bool + Notes string // 注释 + ForeignkeyStructName string // 外键类目 + ForeignkeyTableName string // 外键表名 + ForeignkeyCol string // 外键列表 + ColName string // 表名 + ColStructName string // 表结构体 +} + +// EmInfo func 表结构定义 +type EmInfo struct { + IsMulti bool + Notes string // 注释 + Type string // 类型 + ColName string // 表名 + ColStructName string // 表结构体 +} + +type funDef struct { + StructName string + TableName string + PreloadList []PreloadInfo + Em []EmInfo +} + +// diff --git a/data/view/model/model.go b/data/view/model/model.go index 9ac0312..a6c5d61 100644 --- a/data/view/model/model.go +++ b/data/view/model/model.go @@ -208,11 +208,7 @@ func (m *_Model) generateFunc() (genOut []GenOutInfo) { pkg.AddImport(`"github.com/jinzhu/gorm"`) pkg.AddImport(`"fmt"`) - data := struct { - StructName string - TableName string - Em []ColumusInfo - }{ + data := funDef{ StructName: getCamelName(tab.Name), TableName: tab.Name, } @@ -220,17 +216,57 @@ func (m *_Model) generateFunc() (genOut []GenOutInfo) { for _, el := range tab.Em { if strings.EqualFold(el.Type, "gorm.Model") { data.Em = append(data.Em, getGormModelElement()...) + pkg.AddImport(`"time"`) } else { - data.Em = append(data.Em, el) - if v2, ok := cnf.EImportsHead[el.Type]; ok { + isMulti := true + for _, v1 := range el.Index { + switch v1.Key { + // case ColumusKeyDefault: + case ColumusKeyPrimary: // primary key.主键 + isMulti = false + case ColumusKeyUnique: // unique key.唯一索引 + isMulti = false + //case ColumusKeyIndex: // index key.复合索引 + case ColumusKeyUniqueIndex: // unique index key.唯一复合索引 + isMulti = false + } + } + + typeName := getTypeName(el.Type) + data.Em = append(data.Em, EmInfo{ + IsMulti: isMulti, + Notes: el.Notes, + Type: typeName, // Type.类型标记 + ColName: el.Name, + ColStructName: getCamelName(el.Name), + }) + if v2, ok := cnf.EImportsHead[typeName]; ok { if len(v2) > 0 { pkg.AddImport(v2) } } } + + // 外键列表 + for _, v := range el.ForeignKeyList { + isMulti, isFind, notes := m.getColumusKeyMulti(v.TableName, v.ColumnName) + if isFind { + var info PreloadInfo + info.IsMulti = isMulti + info.Notes = notes + info.ForeignkeyTableName = v.TableName + info.ForeignkeyCol = v.ColumnName + info.ForeignkeyStructName = getCamelName(v.TableName) + info.ColName = el.Name + info.ColStructName = getCamelName(el.Name) + data.PreloadList = append(data.PreloadList, info) + } + } + // ---------end-- + } - tmpl, err := template.New("gen_logic").Parse(genfunc.GetGenLogicTemp()) + tmpl, err := template.New("gen_logic").Funcs(template.FuncMap{"GenPreloadList": GenPreloadList}).Parse(genfunc.GetGenLogicTemp()) if err != nil { panic(err) } @@ -239,10 +275,26 @@ func (m *_Model) generateFunc() (genOut []GenOutInfo) { pkg.AddFuncStr(buf.String()) genOut = append(genOut, GenOutInfo{ - FileName: fmt.Sprintf("gen.%v.go", tab.Name), + FileName: fmt.Sprintf(m.info.DbName+".gen.%v.go", tab.Name), FileCtx: pkg.Generate(), }) } return } + +// GenPreloadList 生成list +func GenPreloadList(list []PreloadInfo, multi bool) string { + if len(list) > 0 { + tmpl, err := template.New("gen_preload").Parse(genfunc.GetGenPreloadTemp(multi)) + if err != nil { + panic(err) + } + var buf bytes.Buffer + tmpl.Execute(&buf, list) + + return buf.String() + } + + return "" +}