package model {{if .Imports}} import ( {{range $val:= .Imports}} "{{$val}}"{{end}} ) {{end}} type ( {{.Name|LowerType}}Model interface { Insert(ctx context.Context, data *{{.Name|UpperType}}) error {{ if .Primary}}Update(ctx context.Context, {{.Primary.Name|LowerType}} {{.Primary.GoType}}, updates map[string]any) error Delete(ctx context.Context, {{.Primary.Name|LowerType}} {{.Primary.GoType}}) error FindOne(ctx context.Context, {{.Primary.Name|LowerType}} {{.Primary.GoType}}) (*{{.Name|UpperType}}, error){{end}} {{range $val:= .Indexes}}Find{{$val.Name|UpperType}}(ctx context.Context {{range $column:=$val.Columns}},{{$column.Name|LowerType}} {{$column.GoType}}{{end}}) (*{{$.Name|UpperType}}, error) {{end}} } {{.Name|UpperType}} struct { updates map[string]any {{range $val := .Columns}}{{$val.Name|UpperType}} {{$val.GoType}} `db:"{{$val.Name}}"`{{if $val.Comment}}//{{$val.Comment}}{{end}} {{end}} } default{{.Name|UpperType}}Model struct { db *gorm.DB } ) func (s *{{.Name|UpperType}}) TableName() string { return "{{.Name}}" } func New{{.Name|UpperType}}() *{{.Name|UpperType}} { return &{{.Name|UpperType}}{ updates: make(map[string]any), {{range $val := .Columns}}{{if $val.Default}}{{$val.Name|UpperType}}:{{if (eq $val.GoType "string")}}"{{$val.Default}}"{{else}}{{$val.Default}}{{end}}, {{end}}{{end}} } } {{range $val := .Columns}} func (s *{{$.Name|UpperType}}) Set{{$val.Name|UpperType}}({{$val.Name|LowerType}} {{$val.GoType}}) { s.{{$val.Name|UpperType}} = {{$val.Name|LowerType}} s.set("{{$val.Name}}", {{$val.Name|LowerType}}) } {{end}} func (s *{{.Name|UpperType}}) set(key string, val any) { s.updates[key] = val } func (s *{{.Name|UpperType}}) UpdateColumn() map[string]any { return s.updates } func new{{.Name|UpperType}}DAO(db *gorm.DB) *default{{.Name|UpperType}}Model { return &default{{.Name|UpperType}}Model{ db: db, } } func (s *default{{.Name|UpperType}}Model) Insert(ctx context.Context, data *{{.Name|UpperType}}) error { return s.db.Create(data).Error } {{ if .Primary}} func (s *default{{.Name|UpperType}}Model) Update(ctx context.Context, {{.Primary.Name|LowerType}} {{.Primary.GoType}}, updates map[string]any) error { return s.db.Model({{.Name|UpperType}}{}).Where("{{.Primary.Name}}=?", {{.Primary.Name|LowerType}}).Updates(updates).Error } func (s *default{{.Name|UpperType}}Model) Delete(ctx context.Context, {{.Primary.Name|LowerType}} {{.Primary.GoType}}) error { return s.db.Where("{{.Primary.Name}}=?", {{.Primary.Name|LowerType}}).Delete(&{{.Name|UpperType}}{}).Error } func (s *default{{.Name|UpperType}}Model) FindOne(ctx context.Context, {{.Primary.Name|LowerType}} {{.Primary.GoType}}) (*{{.Name|UpperType}}, error) { row := {{.Name|UpperType}}{} err := s.db.Where("{{.Primary.Name}}=?", {{.Primary.Name|LowerType}}).Find(&row).Error return findResultWithError(&row,err) } {{end}} {{range $val:= .Indexes}} func (s *default{{$.Name|UpperType}}Model) Find{{$val.Name|UpperType}}(ctx context.Context {{range $column:=$val.Columns}},{{$column.Name|LowerType}} {{$column.GoType}}{{end}}) (*{{$.Name|UpperType}}, error) { row := {{$.Name|UpperType}}{} err := s.db.Where("{{$val.Columns|UpdateColumn}}" {{range $column:=$val.Columns}},{{$column.Name|LowerType}}{{end}}).Find(&row).Error return findResultWithError(&row,err) } {{end}}