-
Notifications
You must be signed in to change notification settings - Fork 0
/
cstruct.go
executable file
·119 lines (110 loc) · 2.91 KB
/
cstruct.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
package main
import (
_ "database/sql"
"errors"
"fmt"
"os"
_ "github.com/go-sql-driver/mysql"
"github.com/urfave/cli"
"jvole.com/createProject/lexer"
"jvole.com/createProject/util"
)
var (
ERRNOFILE = errors.New("未指定sql文件:-f ./user.sql")
ERRNOSQL = errors.New("未指定数据库类型:-d mysql(cockroach)")
structPath = "./genstruct/"
packageName = "genstruct"
)
/*sadfa
*/
func CstructFile(c *cli.Context) error {
if c.String("cover") == "true" {
COVRE = true
} else {
COVRE = false
}
db := c.String("database")
sqlfile := c.String("file")
if db != "mysql" && db != "cockroach" && db != "mariadb" && db != "postgresql" {
fmt.Println("目前只支持mysql,mariadb,postgresql,cockroach")
return ERRNOSQL
}
if sqlfile == "" {
fmt.Println("您未指定sql文件")
return ERRNOFILE
}
if db == "mysql" || db == "mariadb" {
return genStructByMysql(sqlfile)
}
if db == "cockroach" || db == "postgresql" {
return genStructByCockroach(sqlfile)
}
return nil
}
//根据cockroach脚本生成struct
func genStructByCockroach(sqlfile string) error {
cockDBlexer := new(lexer.CockDBLexer)
cocksqlStr := cockDBlexer.SqlString(sqlfile)
str := cockDBlexer.CreateTableString(cocksqlStr)
os.Mkdir(structPath, os.ModePerm) //在当前目录下生成md目录
for _, v := range str {
tname := cockDBlexer.TableName(v)
field := cockDBlexer.Field(v)
structStr := cockDBlexer.CreateStruct(packageName, tname, field)
//生成文件
fileName := tname + ".go"
exist, err := ut.FileOrPathExists(structPath + fileName)
if !COVRE && exist {
fmt.Println(util.Red(structPath + fileName + "文件已存在"))
// return err
}
sf, err := os.Create(structPath + fileName)
if err != nil {
fmt.Println(err)
return err
}
_, err = sf.Write([]byte(structStr))
if err != nil {
fmt.Println(err)
return err
}
// pp.Println(err)
if !(!COVRE && exist) && err == nil {
fmt.Println(structPath + fileName + "生成成功")
}
}
return nil
}
//根据mysql脚本生成struct
func genStructByMysql(sqlfile string) error {
mysqlLexer := new(lexer.MysqlLexer)
sqlStr := mysqlLexer.SqlString(sqlfile)
str := mysqlLexer.CreateTableString(sqlStr)
os.Mkdir(structPath, os.ModePerm) //在当前目录下生成md目录
for _, v := range str {
tname := mysqlLexer.TableName(v)
field := mysqlLexer.Field(v)
structStr := mysqlLexer.CreateStruct(packageName, tname, field)
//生成文件
fileName := tname + ".go"
exist, err := ut.FileOrPathExists(structPath + fileName)
if !COVRE && exist {
fmt.Println(util.Red(structPath + fileName + "文件已存在"))
// return err
}
sf, err := os.Create(structPath + fileName)
if err != nil {
fmt.Println(err)
return err
}
_, err = sf.Write([]byte(structStr))
if err != nil {
fmt.Println(err)
return err
}
if !(!COVRE && exist) && err == nil {
fmt.Println(structPath + fileName + "生成成功")
}
}
return nil
}