-
Notifications
You must be signed in to change notification settings - Fork 3
/
dao.go
156 lines (141 loc) · 4.54 KB
/
dao.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package dao
import (
"context"
"fmt"
"os"
"os/exec"
"path"
"text/template"
"time"
"github.com/abulo/ratel/v3/toolkit/base"
"github.com/abulo/ratel/v3/util"
"github.com/fatih/color"
"github.com/spf13/cobra"
)
var (
CmdNew = &cobra.Command{
Use: "dao",
Short: "数据访问对象",
Long: "创建数据访问对象: toolkit dao",
Run: Run,
}
)
func Run(cmd *cobra.Command, args []string) {
// 数据初始化
if err := base.InitBase(); err != nil {
fmt.Println("初始化:", color.RedString(err.Error()))
return
}
// 创建文件夹
dir := path.Join(base.Path, "dao")
_ = os.MkdirAll(dir, os.ModePerm)
// 初始化上下文
timeout := "60s"
t, err := time.ParseDuration(timeout)
if err != nil {
fmt.Println("初始化:", color.RedString(err.Error()))
return
}
ctx, cancel := context.WithTimeout(context.Background(), t)
defer cancel()
//获取表信息
tableList, err := base.TableList(ctx, base.Config.String("db.Database"))
if err != nil {
fmt.Println("数据库信息获取:", color.RedString(err.Error()))
return
}
tables := make([]string, 0)
if len(args) > 0 {
tableName := args[0]
if tableName != "" {
tables = util.Explode(",", tableName)
}
}
for _, table := range tableList {
if !util.Empty(tables) {
if !util.InArray(table.TableName, tables) {
continue
}
}
column, err := base.TableColumn(ctx, base.Config.String("db.Database"), table.TableName)
if err != nil {
continue
}
GenerateDao(table, column)
}
//格式化代码
_ = os.Chdir(dir)
cmdShell := exec.Command("go", "fmt")
if _, err := cmdShell.CombinedOutput(); err != nil {
fmt.Println("代码格式化错误:", color.RedString(err.Error()))
return
}
cmdImport := exec.Command("goimports", "-w", path.Join(dir, "*.go"))
cmdImport.CombinedOutput()
}
// GenerateDao
func GenerateDao(table base.Table, column []base.Column) {
filePath := path.Join(base.Path, "dao", table.TableName+".go")
//存在文件,需要先将文件删除掉
if util.FileExists(filePath) {
util.Delete(filePath)
}
file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0755)
if err != nil {
fmt.Println("文件句柄错误:", color.RedString(err.Error()))
return
}
//go文件生成地址
tpl := template.Must(template.New("name").Funcs(template.FuncMap{
"CamelStr": base.CamelStr,
"Helper": base.Helper,
"SymbolChar": base.SymbolChar,
"Pointer": base.Pointer,
}).Parse(DaoTemplate()))
//定义结构体接收数据
data := base.DaoParam{
Table: table,
TableColumn: column,
}
//渲染输出
err = tpl.Execute(file, data)
if err != nil {
fmt.Println("模板解析错误:", color.RedString(err.Error()))
return
}
fmt.Printf("\n🍺 CREATED %s\n", color.GreenString(filePath))
}
// DaoTemplate 模板
func DaoTemplate() string {
outString := `
package dao
import "github.com/abulo/ratel/v3/stores/null"
// {{CamelStr .Table.TableName}} {{.Table.TableComment}} {{.Table.TableName}}
type {{CamelStr .Table.TableName}} struct {
{{- range .TableColumn }}
{{- if eq .IsNullable "YES" }}
{{CamelStr .ColumnName}} {{Pointer .DataTypeMap.Empty}}{{.DataTypeMap.Empty}} {{SymbolChar}}db:"{{.ColumnName}}" json:"{{Helper .ColumnName}}"{{SymbolChar}} //{{.DataType}} {{.ColumnComment}}
{{- else }}
{{- if eq .ColumnKey "PRI" }}
{{CamelStr .ColumnName}} *{{.DataTypeMap.Default}} {{SymbolChar}}db:"{{.ColumnName}}" json:"{{Helper .ColumnName}}"{{SymbolChar}} //{{.DataType}} {{.ColumnComment}},PRI
{{- else }}
{{CamelStr .ColumnName}} {{Pointer .DataTypeMap.Default}}{{.DataTypeMap.Default}} {{SymbolChar}}db:"{{.ColumnName}}" json:"{{Helper .ColumnName}}"{{SymbolChar}} //{{.DataType}} {{.ColumnComment}}
{{- end}}
{{- end}}
{{- end}}
}
`
return outString
}
// package dao
// import "github.com/abulo/ratel/v3/stores/null"
// // {{CamelStr .Table.TableName}} {{.Table.TableComment}} {{.Table.TableName}}
// type {{CamelStr .Table.TableName}} struct {
// {{- range .TableColumn }}
// {{- if eq .IsNullable "YES" }}
// {{CamelStr .ColumnName}} {{.DataTypeMap.Empty}} {{SymbolChar}}db:"{{.ColumnName}}" json:"{{Helper .ColumnName}}" form:"{{Helper .ColumnName}}" uri:"{{Helper .ColumnName}}" xml:"{{Helper .ColumnName}}" proto:"{{Helper .ColumnName}}"{{SymbolChar}} //{{.DataType}} {{.ColumnComment}}
// {{- else }}
// {{CamelStr .ColumnName}} {{.DataTypeMap.Default}} {{SymbolChar}}db:"{{.ColumnName}}" json:"{{Helper .ColumnName}}" form:"{{Helper .ColumnName}}" uri:"{{Helper .ColumnName}}" xml:"{{Helper .ColumnName}}" proto:"{{Helper .ColumnName}}"{{SymbolChar}} //{{.DataType}} {{.ColumnComment}}
// {{- end}}
// {{- end}}
// }