func export support

支持快捷函数导出。
This commit is contained in:
谢小军
2020-01-09 20:04:33 +08:00
parent 204164e8b9
commit 1ff17da96f
15 changed files with 932 additions and 44 deletions

View File

@@ -4,6 +4,7 @@ out_dir : ./model # 输出目录
singular_table : false # 单表模式:true:禁用表名复数,false:采用表明复数 参考:gorm.SingularTable singular_table : false # 单表模式:true:禁用表名复数,false:采用表明复数 参考:gorm.SingularTable
simple : true # 简单输出(默认gorm标签不输出) simple : true # 简单输出(默认gorm标签不输出)
is_out_sql : false # 是否输出 sql 原信息 is_out_sql : false # 是否输出 sql 原信息
is_out_func : true # 是否输出 快捷函数
is_json_tag : true # 是否打json标记 is_json_tag : true # 是否打json标记
is_foreign_key : true # 是否导出外键关联 is_foreign_key : true # 是否导出外键关联
mysql_info: mysql_info:

View File

@@ -12,6 +12,7 @@ type Config struct {
SingularTable bool `yaml:"singular_table"` SingularTable bool `yaml:"singular_table"`
IsForeignKey bool `yaml:"is_foreign_key"` IsForeignKey bool `yaml:"is_foreign_key"`
IsOutSQL bool `yaml:"is_out_sql"` IsOutSQL bool `yaml:"is_out_sql"`
IsOutFunc bool `yaml:"is_out_func"`
} }
// MysqlDbInfo mysql database information. mysql 数据库信息 // MysqlDbInfo mysql database information. mysql 数据库信息
@@ -88,3 +89,13 @@ func SetForeignKey(b bool) {
func GetIsOutSQL() bool { func GetIsOutSQL() bool {
return _map.IsOutSQL 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
}

View File

@@ -55,7 +55,7 @@ type _{{$obj.StructName}}Mgr struct {
// {{$obj.StructName}}Mgr open func // {{$obj.StructName}}Mgr open func
func {{$obj.StructName}}Mgr(db *gorm.DB) *_{{$obj.StructName}}Mgr { func {{$obj.StructName}}Mgr(db *gorm.DB) *_{{$obj.StructName}}Mgr {
if db == nil { 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}} 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 { func (obj *_{{$obj.StructName}}Mgr) GetTableName() string {
return "{{$obj.TableName}}" 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}}
}
}`
) )

View File

@@ -28,7 +28,7 @@ type _ExampleMgr struct {
// ExampleMgr open func // ExampleMgr open func
func ExampleMgr(db *gorm.DB) *_ExampleMgr { func ExampleMgr(db *gorm.DB) *_ExampleMgr {
if db == nil { if db == nil {
panic(fmt.Errorf("ExampleMgr init need db")) panic(fmt.Errorf("ExampleMgr need init by db"))
} }
return &_ExampleMgr{_BaseMgr: &_BaseMgr{DB: db}} return &_ExampleMgr{_BaseMgr: &_BaseMgr{DB: db}}
} }
@@ -116,7 +116,7 @@ func (obj *_ExampleMgr) GetByPrimaryKeys(ids []int64) (results []*Example, err e
//////////////////////////option case //////////////////////////////////////////// //////////////////////////option case ////////////////////////////////////////////
// GetByPrimaryKey 功能选项模式获取 // GetByOption 功能选项模式获取
func (obj *_ExampleMgr) GetByOption(opts ...Option) (result Example, err error) { func (obj *_ExampleMgr) GetByOption(opts ...Option) (result Example, err error) {
options := options{ options := options{
query: make(map[string]interface{}, len(opts)), query: make(map[string]interface{}, len(opts)),

View File

@@ -9,3 +9,11 @@ func GetGenBaseTemp() string {
func GetGenLogicTemp() string { func GetGenLogicTemp() string {
return genlogic return genlogic
} }
// GetGenPreloadTemp get gen preload template str
func GetGenPreloadTemp(multi bool) string {
if multi {
return genPreloadMulti
}
return genPreload
}

View File

@@ -4,26 +4,24 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/xxjwxc/gormt/data/view/genfunc/model"
"github.com/xxjwxc/public/mysqldb" "github.com/xxjwxc/public/mysqldb"
) )
func TestFunc(t *testing.T) { func TestFunc(t *testing.T) {
orm := mysqldb.OnInitDBOrm("root:qwer@tcp(127.0.0.1:3306)/matrix?charset=utf8&parseTime=True&loc=Local") orm := mysqldb.OnInitDBOrm("root:qwer@tcp(127.0.0.1:3306)/matrix?charset=utf8&parseTime=True&loc=Local")
defer orm.OnDestoryDB() defer orm.OnDestoryDB()
mgr := model.OrganMgr(orm.DB)
mgr.IsRelated(true) // 设置允许加载外键
res, err := mgr.GetFromUserID(2) // 通过列获取
fmt.Println(res, err)
mgr := ExampleMgr(orm.DB) obj1, err := mgr.GetByOptions(mgr.WithID(1), mgr.WithUserID(1)) // 批量获取
obj, err := mgr.GetFromID(1)
fmt.Println(obj, err)
obj1, err := mgr.GetByPrimaryKey(1)
fmt.Println(obj1, err) 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) 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)
} }

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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"`
}

View File

@@ -1,6 +1,9 @@
package gtools package gtools
import ( import (
"fmt"
"os/exec"
"github.com/xxjwxc/gormt/data/view/model" "github.com/xxjwxc/gormt/data/view/model"
"github.com/xxjwxc/gormt/data/config" "github.com/xxjwxc/gormt/data/config"
@@ -28,12 +31,12 @@ func Execute() {
path := config.GetOutDir() + "/" + v.FileName path := config.GetOutDir() + "/" + v.FileName
tools.WriteFile(path, []string{v.FileCtx}, true) tools.WriteFile(path, []string{v.FileCtx}, true)
// fmt.Println("formatting differs from goimport's:") fmt.Println("formatting differs from goimport's:")
// cmd, _ := exec.Command("goimports", "-l", "-w", path).Output() cmd, _ := exec.Command("goimports", "-l", "-w", path).Output()
// fmt.Println(string(cmd)) fmt.Println(string(cmd))
// fmt.Println("formatting differs from gofmt's:") fmt.Println("formatting differs from gofmt's:")
// cmd, _ = exec.Command("gofmt", "-l", "-w", path).Output() cmd, _ = exec.Command("gofmt", "-l", "-w", path).Output()
// fmt.Println(string(cmd)) fmt.Println(string(cmd))
} }
} }

View File

@@ -55,24 +55,37 @@ func getUninStr(left, middle, right string) string {
return re return re
} }
func getGormModelElement() []ColumusInfo { func getGormModelElement() []EmInfo {
var result []ColumusInfo var result []EmInfo
result = append(result, ColumusInfo{ result = append(result, EmInfo{
BaseInfo: BaseInfo{Name: "id", Notes: "Primary key"}, IsMulti: false,
Type: "int64", // Type.类型标记 Notes: "Primary key",
Index: []KList{KList{Key: ColumusKeyPrimary}}, // index list.index列表 Type: "int64", // Type.类型标记
ColName: "id",
ColStructName: "ID",
}) })
result = append(result, ColumusInfo{ result = append(result, EmInfo{
BaseInfo: BaseInfo{Name: "created_at", Notes: "created time"}, IsMulti: false,
Type: "time.Time", // Type.类型标记 Notes: "created time",
Type: "time.Time", // Type.类型标记
ColName: "created_at",
ColStructName: "CreatedAt",
}) })
result = append(result, ColumusInfo{
BaseInfo: BaseInfo{Name: "updated_at", Notes: "updated time"}, result = append(result, EmInfo{
Type: "time.Time", // Type.类型标记 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"}, result = append(result, EmInfo{
Type: "time.Time", // Type.类型标记 IsMulti: false,
Notes: "deleted time",
Type: "time.Time", // Type.类型标记
ColName: "deleted_at",
ColStructName: "DeletedAt",
}) })
return result return result
} }

View File

@@ -67,3 +67,34 @@ type GenOutInfo struct {
FileName string // output file name .输出文件名 FileName string // output file name .输出文件名
FileCtx string // output file context. 输出文件内容 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
}
//

View File

@@ -208,11 +208,7 @@ func (m *_Model) generateFunc() (genOut []GenOutInfo) {
pkg.AddImport(`"github.com/jinzhu/gorm"`) pkg.AddImport(`"github.com/jinzhu/gorm"`)
pkg.AddImport(`"fmt"`) pkg.AddImport(`"fmt"`)
data := struct { data := funDef{
StructName string
TableName string
Em []ColumusInfo
}{
StructName: getCamelName(tab.Name), StructName: getCamelName(tab.Name),
TableName: tab.Name, TableName: tab.Name,
} }
@@ -220,17 +216,57 @@ func (m *_Model) generateFunc() (genOut []GenOutInfo) {
for _, el := range tab.Em { for _, el := range tab.Em {
if strings.EqualFold(el.Type, "gorm.Model") { if strings.EqualFold(el.Type, "gorm.Model") {
data.Em = append(data.Em, getGormModelElement()...) data.Em = append(data.Em, getGormModelElement()...)
pkg.AddImport(`"time"`)
} else { } else {
data.Em = append(data.Em, el) isMulti := true
if v2, ok := cnf.EImportsHead[el.Type]; ok { 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 { if len(v2) > 0 {
pkg.AddImport(v2) 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 { if err != nil {
panic(err) panic(err)
} }
@@ -239,10 +275,26 @@ func (m *_Model) generateFunc() (genOut []GenOutInfo) {
pkg.AddFuncStr(buf.String()) pkg.AddFuncStr(buf.String())
genOut = append(genOut, GenOutInfo{ 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(), FileCtx: pkg.Generate(),
}) })
} }
return 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 ""
}